【发布时间】:2014-11-16 20:53:51
【问题描述】:
也许这是一个由四部分组成的问题:
- 上传到子目录
- 子目录不存在
- 使用与本地文件不同的远程文件名
- 子目录应该有明确的权限(类似于WinSCP .NET assembly - How to set folder permissions after creating directory?中的root问题)
尝试过:
var localPath = Path.GetTempFileName();
var remoteFolder = "/some/directory/beneath/root";
var slash = "/"; // maybe given as '/' or '\'...
var remotePath = remoteFolder + slash + "destination.ext1.ext2.txt";
var session = new Session(sessionOptions);
var result = session.PutFiles(localPath, remotePath, false, new FileTransferOptions { FilePermissions = new FilePermissions { Octal = "700" }, KeepTimestamp..., etc });
result.Check();
抛出异常Cannot create remote file '/some/directory/beneath/root/destination.ext1.ext2.txt'. ---> WinSCP.SessionRemoteException: No such file or directory.
我终于能够通过the crazy workaround indicated here 在我的临时路径中创建子目录结构并在第一个文件夹上使用PutFiles 来创建具有正确权限的子目录:
var tempRoot = Path.GetTempPath();
var tempPath = Path.Combine(tempRoot, remoteFolder);
Directory.CreateDirectory(tempPath);
// only need to upload the first segment, PutFiles will magically grab the subfolders too...
var segment = remoteFolder.Substring(0, remoteFolder.IndexOf(slash, StringComparison.Ordinal));
if( !this.DoesFolderExist(segment) )
{
// here's the workaround...
try
{
this._session.PutFiles(Path.Combine(tempRoot, segment), segment, false, new TransferOptions { FilePermissions = this._transferOptions.FilePermissions }).Check();
}
catch (InvalidOperationException)
{
// workaround for bug in .NET assembly prior to 5.5.5/5.6.1 beta
// although I never hit this catch, maybe I've got a new enough version?
}
}
Directory.Delete(tempPath); // finish workaround
但这太不直观了。
【问题讨论】:
-
问题不清楚。目标目录
/some/directory/beneath/root/是否存在?你能详细说明你的四点吗? -
每点 #2 -- 子目录不存在。什么不清楚?我想上传一个文件到一个不存在的子目录,但是使用不同的文件名,并确保它存在的文件和目录具有相同的权限。
-
什么子目录?
/some/directory/beneath/root/必须存在。我不明白确保它存在的文件和目录具有相同的权限。
标签: c# file-permissions winscp winscp-net