You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WinSCP能否用文件掩码实现不含本地目录名的单文件上传?

解决WinSCP文件掩码上传时不带本地目录名的问题

好问题!我之前也遇到过类似的WinSCP .NET组件的行为差异问题,咱们来一步步解决它:

问题核心

你原来的代码session.PutFiles(_localPath + "*", _remotePath)之所以能直接把本地目录下的文件传到远程目录(不带本地目录名),是因为路径里的*明确告诉WinSCP:只上传该目录下的所有文件,不要包含目录本身。

但当你改用TransferOptions.FileMask = "*",同时把本地路径设为纯目录路径_localPath时,WinSCP的默认行为是上传整个目录结构——也就是在远程目录下创建和本地同名的子目录,再把文件传进去,这就是你遇到的问题。

解决方案

要实现和原代码完全一致的效果(用FileMask替代路径里的*,同时不创建本地目录名到远程),只需要在TransferOptions中添加一个原始设置,禁用目录结构保留:

// 初始化传输选项
TransferOptions transferOptions = new TransferOptions();
// 设置文件掩码,这里可以用*匹配所有文件,也可以写更复杂的规则比如"*.txt|*.log"
transferOptions.FileMask = "*";
// 关键:禁用目录结构保留,让文件直接上传到目标远程目录
transferOptions.RawSettings.Add("PreserveDirectoryStructure", "0");

// 执行上传
TransferOperationResult tR = session.PutFiles(_localPath, _remotePath, false, transferOptions);
// 记得检查上传结果,处理可能的错误
tR.Check();

原理说明

  • FileMask的作用是过滤要上传的文件,而不是控制路径结构——它决定哪些文件会被选中,但不改变WinSCP处理目录层级的逻辑。
  • PreserveDirectoryStructure=0这个原始设置会覆盖WinSCP的默认行为,告诉它不要在远程路径下创建本地目录的副本,而是把所有匹配的文件直接放到指定的远程目录根下,完全等价于_localPath + "*"的效果。

额外提示

如果你需要更精细的文件过滤,比如只上传特定后缀的文件,可以直接修改FileMask,比如:

// 只上传PDF和Excel文件,排除临时文件
transferOptions.FileMask = "*.pdf;*.xlsx|*.tmp";

内容的提问来源于stack exchange,提问作者rupweb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:31:01