3

次の関数を使用してファイルをごみ箱に削除しています: (C++、MFC、Unicode)

bool DeleteFileToPaperbasket (CString filename)
{
   TCHAR Buffer[2048+4];

   _tcsncpy_s (Buffer, 2048+4, filename, 2048);
   Buffer[_tcslen(Buffer)+1]=0; //Double-Null-Termination

   SHFILEOPSTRUCT s;
   s.hwnd                  = NULL;
   s.wFunc                 = FO_DELETE;
   s.pFrom                 = Buffer;
   s.pTo                   = NULL;
   s.fFlags                = FOF_ALLOWUNDO | FOF_SILENT | FOF_NOERRORUI;
   s.fAnyOperationsAborted = false;
   s.hNameMappings         = NULL;
   s.lpszProgressTitle     = NULL;

   int rc = SHFileOperation(&s);

   return (rc==0);
}

これは、ほとんどのファイルでうまく機能します。ただし、パスとファイル名が 255 文字を超える場合 (それでも 2048 文字よりはるかに短い場合)、SHFileOperation は 124 を返します。これは DE_INVALIDFILES です。

しかし、何が問題なのですか?私はすべてを100万回チェックしました。パスは二重ヌルで終了します。\\?\ は使用していません。短いファイル名でも機能します。

私は完全にアイデアがありません...

4

2 に答える 2

3

後方比較可能性が --- いくつかの点であなたを苦しめていると思います。使用しているパスを実際に確認し、エラー チェック コードを実装して支援する必要があります。しかし、ここにいくつかのヒントがあります。

  1. DE_INVALIDFILES 0x7C「ソースまたは宛先、あるいはその両方のパスが無効でした。」は取得できません。最大パス違反の場合、DE_PATHTOODEEP 0x79 「ソースまたは宛先パスが MAX_PATH を超えたか、超える可能性があります。」が表示されます。

  2. これらのエラー コード (戻り値) は、時間の経過とともに変更され、変更される可能性があり、特定のエラー コードが何を意味するかを確認するには、GetLastError 関数 (msdn)で確認する必要があります。

  3. また、SHFileOperation 関数のドキュメントから引用します。「fAnyOperationsAborted と戻り値をチェックしないと、関数が要求したタスクを完全に完了したことを知ることができず、誤った仮定の下で続行する可能性があります。」

  4. 非常に長いパス名にはこの API を使用しないでください。Vista+では IFileOperation インターフェイスに置き換えられています。

  5. このLEGACY api ではなくエクスプローラーで機能する理由の説明は、ファイル、パス、および名前空間の命名に関する msdn ページから取得したものです。

シェルとファイル システムの要件は異なります。シェル ユーザー インターフェイスが正しく解釈できない Windows API を使用してパスを作成することができます。

これが役に立ったことを願っています

于 2012-10-10T22:05:03.010 に答える
0

ごみ箱は、パスの長さが MAX_PATH を超えるファイルをサポートしていません。エクスプローラーでそのようなファイルをリサイクルしようとすることで、これを自分で確認できます。パスが長すぎるというエラー メッセージが表示されます。

于 2012-08-28T08:21:29.923 に答える