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
相关产品推荐
相关产品推荐

