为什么在上传时将文件的本地目录创建到远程

Why is file's local directory being created to remote on upload

我正在创建一个将提供 FTPS 功能的 .NET 服务应用程序。

将本地文件上传到远程位置时,会在远程位置重新创建本地文件的直接目录。

我怀疑我使用的面具是我问题的一部分,但我不确定。是什么导致在远程位置重新创建目录?

我已经尝试根据 documentation.

更改掩码
public static void Upload()
{
    using (Session session = new Session())
    {
        /* Connect
         * */
        session.Open(GetSessionOptions());

        /* Upload files
         * */
        string localFilePath = "C:\WinScpTest\test\";
        string remoteFilePath = $"/Remote/{DateTime.Now.Year.ToString()}/";
        bool removeOrig = false;
        TransferOptions transferOpts = new TransferOptions
        {
            TransferMode = TransferMode.Binary,
            FileMask = "*.txt"
        };
        TransferOperationResult result = session.PutFiles(localFilePath, remoteFilePath, removeOrig, transferOpts);

    }
}

我希望本地文件 C:\WinScpTest\test\file.txt 上传到 /Remote/2019/file.txt。相反,我看到了这个 /Remote/2019/test/file.txt

如评论中所述,根据用于复制或上传文件的工具,删除或添加尾随目录分隔符决定是否包含父目录。

在大多数情况下,例如本例,目标路径上的尾随目录分隔符表示也将创建父目录。删除它表示文件应直接上传到给定的文件夹中。

在您的情况下,这意味着将 $"/Remote/{DateTime.Now.Year.ToString()}/"; 更改为 $"/Remote/{DateTime.Now.Year.ToString()}";

您的源路径语法不明确。来自 C:\WinScpTest\test\,不清楚是要上传文件夹 test 还是文件夹 test.

中的文件

如要上传文件夹test中的文件,使用通配符*:

string localFilePath = "C:\WinScpTest\test\*";

Documentation for localPath argument of Session.PutFiles 说:

Full path to local file or directory to upload. Filename in the path can be replaced with Windows wildcard to select multiple files. To upload all files in a directory, use mask *.


虽然您实际上只想上传 *.txt 个文件,但您可以删除所有 TransferOptions 代码(无论如何,TransferMode.Binary 是默认值)并使用:

string localFilePath = "C:\WinScpTest\test\*.txt";
string remoteFilePath = $"/Remote/{DateTime.Now.Year.ToString()}/";
TransferOperationResult result = session.PutFiles(localFilePath, remoteFilePath);

@Steffen 的回答在语义上并不正确。它 "works",因为它告诉 WinSCP 将文件夹 test 上传为 2019。当您想将文件夹 test 中的文件上传到远程文件夹 2019.