文件太长异常

时间:2012-07-04 19:26:08

标签: c# file delete-file

我正试图从远程计算机中删除文件,如下所示:

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();

它给了我一个例外,即文件名或路径太长。

我尝试添加\\?\但它没有用...为什么会发生这种情况以及如何解决这个问题?

4 个答案:

答案 0 :(得分:2)

将网络共享映射到更靠近文件的目录之一。尝试使用通配符删除它。

答案 1 :(得分:2)

我使用了三种方法,但要注意它们需要非托管P / Invoke代码。不多,所以你可以复制/粘贴,如果你不明白它是如何工作的。

  1. Use the 8.3 filenames(与DOS兼容的文件名)

  2. 使用您提到的\?\语法。但是,我不相信你可以直接从C#中使用它 - 你需要调用本机方法。注意 - 这具有安全隐患,因为字符串未被解析,而是直接传递给文件系统。

  3. 使用非托管文件API。

  4. 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以使其更安全,从而减少文件名本身的长度。