我有一个外部USB,NTFS格式的硬盘驱动器,其中包含许多文件,我需要最终复制到Windows Server 2008 R2计算机上的驱动器.
驱动器上的文件由安装在Solaris上的驱动器运行的脚本放置在那里.执行此副本的用户不小心并在Windows计算机上编辑了他们的副本脚本,从而产生了shell脚本行,例如:
cp /sourceDir/sourceFileName /externalDrivePath/targetFileName\r\n
因此,外部驱动器上的文件在其文件名中有一个尾随回车符.标准Windows复制实用程序(copy,xcopy,robocopy)无法复制这些文件,错误为0x7B/123:"文件名,目录名称或卷标语法不正确."
我已经测试过,并且相当确定如果我将驱动器再次安装在Linux机器上,我应该可以使用以下命令修复文件:
mv /externalDrive/targetFileName\r /externalDrivePath/targetFileName\n
但是,我没有立即访问Linux机器.
到目前为止我已经尝试过修复/移动这些文件:
Windows Server 2008 R2上的"应用程序"解决方案:
在Windows资源管理器中重命名文件 - 由于文件数量庞大,这将是不可行的解决方案,但它无论如何都无法正常工作.
与cmd提示符中的文件名匹配的通配符模式,例如copy E:\externalDrivePath\targetFileName* anotherPath
.失败,出现0x7B错误.
使用8.3(短)文件名从cmd提示符复制文件.有问题的文件没有短名称,每个输出dir /x
Windows Server 2008 R2上的"编程"解决方案:
使用Python/Java复制/重命名文件:任何打开/复制回车文件的尝试都会将异常跟踪引发回同一个0x7B Windows错误.
使用Windows C'CopyFile'API复制文件:失败,出现0x7B错误.在这里,我使用FindNextFile API找到了这些文件,并将该源路径传递给CopyFile,但操作系统仍无法复制该文件.
使用fopen,ofstream等在C语言中编写我自己的文件复制功能.fopen调用再次因0x7B而失败.
使用C++ boost :: filesystem API复制文件:失败,出现0x7B错误.再次,使用boost :: filesystem :: directory_iterator找到文件并将找到的文件的路径传递给boost :: filesystem :: copy_file()
将Win32 API CopyFile/MoveFile的文件路径提供为"\?\ E:\ externalDrivePath\targetFileName\r \n".调用再次失败,出现0x7B错误.
我还涉及在OS X机器上安装此驱动器以运行副本,期望它将像Solaris那样为NTFS驱动器提供支持.但是,它无法将类似的错误消息复制到Windows - 我猜OS X的NTFS实现更像"Windows-like"?
如果这在Windows上是可解的,我觉得它要么需要一个非常低级的C函数来操作FILE本身,而不是根据它的字符串文件名"打开"它.不知道该怎么做.那个,或者我不知道的一些文件修复工具已经包含了这个功能.
任何替代方法或建议如何实现我所描述的将是最受欢迎的.