3

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

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

4 回答 4

2

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

  1. 使用 8.3 文件名(ala DOS 兼容文件名)

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

  3. 使用非托管文件 API。

这是一系列很好的博客文章,正好解决了这个问题

埃里克

于 2012-07-04T19:46:43.617 回答
2

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

于 2012-07-04T19:30:25.833 回答
1

长路径前缀\\?\只能用于非 UNC 路径。改为使用\\?\UNC\UNC 路径的前缀并调用 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...");
  }
}

请注意,您必须使用 Unicode 版本DeleteFile才能使用长路径前缀\\?\UNC\

于 2012-07-04T20:03:04.383 回答
0

查看文件名的末尾,由于名称中的字符模糊,Windows 似乎无法处理它。

我使用在线工具对文件名部分进行解码,这在理论上可以解释为什么它无法删除它。

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

于 2012-07-04T19:37:23.803 回答