C# Can';t复制/移动文件,文件名末尾留有空格

C# Can';t复制/移动文件,文件名末尾留有空格,c#,winapi,filenames,C#,Winapi,Filenames,真是疯了!我已经使用Far2.0创建了一个文件(也许您可以使用其他文件管理器);它的文件名是“C:\123.txt”(是的,文件路径末尾有空格) 我正试图用C程序复制或移动这个文件: 但由于“找不到文件‘C:\123.txt’”异常而失败。但是文件存在 我正在尝试Windows API: [DllImport("kernel32.dll")] public static extern int MoveFile(string lpExistingFileName, string lpNewFile

真是疯了!我已经使用Far2.0创建了一个文件(也许您可以使用其他文件管理器);它的文件名是“C:\123.txt”(是的,文件路径末尾有空格)

我正试图用C程序复制或移动这个文件:

但由于“找不到文件‘C:\123.txt’”异常而失败。但是文件存在

我正在尝试Windows API:

[DllImport("kernel32.dll")]
public static extern int MoveFile(string lpExistingFileName, string lpNewFileName);
MoveFile("C:\\123.txt ", "C:\\456.txt",);
但它也失败了

我正在尝试xcopy实用程序:

C:\>xcopy "C:\123.txt " "C:\456.txt" /Y
File not found - 123.txt
0 File(s) copied
如何以编程方式重命名该文件?为什么会发生这种情况


My OS:Windows 7 x64

您的文件名中有一个字符在Win32中是非法的。要绕过Win32路径分析器,只需在文件名前面加上
\\?\
。例如:

MoveFile(@"\\?\C:\123.txt ", "C:\\456.txt");

此技术还允许您拥有长达32k的路径(在Win32中,包括驱动器号在内,您只能获得260个路径)。

您可以使用空格后的非法字符访问文件

C:\123.txt :illegal

之后所有的东西都会被移除,但空间会保留下来。您也可以通过这种方式创建以空格结尾的文件。

如果使用
@“C:\123.txt”
会怎么样?您是如何创建该文件的?通常情况下,空格会被截断。zerkms是路径中的非法字符。如果启用了短文件名生成,则可以执行
dir/x
查看短名称(通常包含
~
)并使用该名称对其进行重命名。这对我很有效,但是FindFirstFile/FindNextFile没有为我返回空格。@malkia:如果您遇到无效文件名的问题,您可以始终使用8.3短名称(如果可用)。在我的情况下,我不能,因为我禁用了8.3支持。如果同一目录中有大量文件,使用8.3可能会降低NTFS的速度(降低速度的原因是试图找到不重用的8.3名称)。我对FindFirstFile/Next的看法是错误的-它工作正常。稍后GetFullPathName删除了该空间。现在一切正常:)(我甚至认为需要UNICODE函数-DeleteFileW,但事实并非如此)
C:\123.txt :illegal