为什么在上传时将文件的本地目录创建到远程
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
.
我正在创建一个将提供 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
.