2

おそらく、これは 4 つの部分からなる質問です。

  1. サブディレクトリにアップロード
  2. サブディレクトリが存在しません
  3. ローカル ファイルとは異なるリモート ファイル名を使用する
  4. サブディレクトリには明示的なアクセス許可が必要です ( WinSCP .NET アセンブリのルートの問題 - ディレクトリを作成した後にフォルダーのアクセス許可を設定する方法に似ています)

試みた:

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.

一時パスにサブディレクトリ構造を作成し、最初のフォルダーで使用することにより、ここに示されているクレイジーな回避策を介して、正しいアクセス許可を持つサブディレクトリを最終的に作成することができました。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

しかし、これはあまりにも直感的ではありませんでした。

4

1 に答える 1