我正试图从远程计算机中删除文件,如下所示:
fileinfo undelteablefile = new fileinfo(
@"\\CompName\c$\documents and settings\UserName\local settings\temporary internet files\content.ie5\k9ef0hmj\%d7%a9%d7%a2%a8%20%d7%9c%20%d7%a2%93%d7%9b%d7%95%d7%9f%20%d7%98%d7%9d%a0%d795%d7%9c%d7%d7%95%d7%92%d7%99%20%d7%97%95%d7%93%d7%a9%d7%99 [1] .jpg");
undeleteablefile.delete();
它给了我一个例外,即文件名或路径太长。
我尝试添加\\?\
但它没有用...为什么会发生这种情况以及如何解决这个问题?
答案 0 :(得分:2)
将网络共享映射到更靠近文件的目录之一。尝试使用通配符删除它。
答案 1 :(得分:2)
我使用了三种方法,但要注意它们需要非托管P / Invoke代码。不多,所以你可以复制/粘贴,如果你不明白它是如何工作的。
Use the 8.3 filenames(与DOS兼容的文件名)
使用您提到的\?\语法。但是,我不相信你可以直接从C#中使用它 - 你需要调用本机方法。注意 - 这具有安全隐患,因为字符串未被解析,而是直接传递给文件系统。
使用非托管文件API。
This is a great series of blog posts that address exactly this issue
埃里克
答案 2 :(得分:1)
长路径前缀\\?\
只能用于非UNC路径。
请改为使用UNC路径的\\?\UNC\
pefix,并调用Win32 API函数DeleteFile
。
有关命名文件和路径的详细信息,请参阅以下MSDN文章。
这是一个小例子:
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool DeleteFile(string lpFileName);
static void Main(string[] args)
{
string yourLongUncPath = @"\\?\UNC\server\path";
if(DeleteFile(yourLongUncPath))
{
Console.Out.WriteLine("Successfully deleted file...");
}
}
请注意,您必须使用DeleteFile
的Unicode版本才能使用
长路径前缀\\?\UNC\
。
答案 3 :(得分:0)
查看文件名的末尾,由于名称中隐藏的字符,Windows似乎无法处理它。
我使用online facility解码文件名部分,这理论上可以解释为什么它无法删除它。
%D7%A9%D7%A2%A8%20%D7%9C%20%D7%A2%93%D7%9B%D7%95%D7%9F%20%D7%98%D7%9D% A0%D795%D7%9C%D7%D7%95%D7%92%D7%99%20%D7%97%95%D7%93%D7%A9%D7%99 1 .jpg
转换时看起来像这样,使用US-ASCII
95 1。 JPG
同样适用于UTF-8
שע לע כוןטם 95ל וגיח דשי1 .jpg
您是否认为可能需要对其进行url-decode以使其更安全,从而减少文件名本身的长度。