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

私が使用したアプローチは 3 つありますが、アンマネージ P/Invoke コードが必要であることに注意してください。それほど多くはないので、仕組みがわからない場合は、おそらくコピーして貼り付けることができます.

  1. 8.3 ファイル名(ala DOS 互換ファイル名)を使用します。

  2. あなたが言及した \?\ 構文を使用してください。ただし、C# から直接使用できるとは思いません。ネイティブ メソッドを呼び出す必要があります。注 - 文字列は解析されず、ファイルシステムに直接渡されるため、これにはセキュリティ上の意味があります。

  3. アンマネージ ファイル API を使用します。

これは、まさにこの問題に対処する優れた一連のブログ投稿です

エリック

于 2012-07-04T19:46:43.617 に答える
2

ファイルに近いディレクトリの 1 つにネットワーク共有をマップします。ワイルドカードで削除してみてください。

于 2012-07-04T19:30:25.833 に答える
1

ロングパスプレフィックス\\?\は、UNC以外のパスでのみ使用できます。代わりに、UNCパスにpefixを使用して\\?\UNC\、Win32API関数を呼び出します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\

于 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 に答える