9

Windowsアプリケーションでより長いファイルパスを処理することを検討しています。

現在、ユーザーがファイルの絶対パスを入力できるテキストボックス(編集ボックス)があります。次に、その型指定されたファイルパスを、を使用してGetWindowText、次のように宣言された文字列に読み込みます。TCHAR FilePath[MAX_PATH];

MAX_PATH明らかに、ここで私は260文字に制限する定数に依存しています。したがって、より長いファイル/パス名を処理するには、TCHAR配列を次のように拡張できますTCHAR FilePath[32767];

それとももっと良い方法はありますか?可変長配列を使用できますか?(TCHAR FilePath[];これはC ++でも可能ですか?-申し訳ありませんが、これはかなり新しいです)。

よろしくお願いします!


これが私が上で述べたものの全体のコードスニペットです:

TCHAR FilePath[MAX_PATH];
ZeroMemory(&FilePath, sizeof(FilePath));
GetWindowText(hWndFilePath, FilePath, MAX_PATH);
4

3 に答える 3

12

Windowsのファイルパスに関しては、いくつかの制限があります。デフォルトでは、パスは260文字を超えることはできません。これは、MAX_PATH定数の目的です。

ただし、パスの前に「\\?」を付けることで、特定の制限付きで、より長いパスにアクセスできます。ただし、「\\?」プレフィックスを使用する場合の制限は、通常、利点を上回ります。

  1. このプレフィックスを持つパスをサポートしないWin32APIがいくつかあります(たとえば、LoadLibrary260文字より長いパスでは常に失敗します)
  2. 「\\?」プレフィックスを使用すると、Win32正規化ルールは有効になりません。たとえば、デフォルトでは、パスの「/」は「\」、「」に変換されます。および「..」は、それぞれ現在のディレクトリと親ディレクトリへの参照に変換されます。「\\?」プレフィックスを使用すると、そのいずれも発生しません。
  3. より長いパスをサポートするようにプログラムを変更できるという理由だけで、他のプログラムが作成したファイルを開くことができない場合があります。これは、他のプログラムも「\\?」プレフィックスを使用していない場合に当てはまります。

正直なところ、ポイント2は本当のキラーです。「\\?」プレフィックスを使用すると、あらゆる種類の問題が発生する可能性があります。そのルートを使用する場合は、基本的にWin32正規化ルールを自分で再実装する必要があります。

したがって、260の制限に固執することをお勧めします。少なくとも、より長いパスに対するより良いプラットフォームサポートができるまでは。

于 2010-07-19T00:16:39.117 に答える
6

それはあなたが書いているプログラムの種類に依存します。私自身の戦略は通常、パスの作成をMAX_PATHの長さに制限することでしたが、より長いパスから既存のデータを読み取ることができます(Deanが回答で言及している「\\?」プレフィックスを使用)。ただし、これには例外があります。たとえば、バックアッププログラムは長いパスを受け入れ、入力として指定されたものを正確に再現する必要があります。

ディーンは確かにWindowsがあなたのために長いパスを正規化しないことは正しいですが、私はこれが原則としてそれほど懸念されることを発見していません。これは通常、パスを正規化するための独自のコードを作成することを意味するのではありません。通常、そもそもそのようなものを生成しない方法でユーザーにパスを入力させることを意味します。

于 2010-07-19T15:30:30.640 に答える
-4

いいえ、パスが長くなると、Windowsはそれを受け入れることができないためです。したがって、技術的には、バッファにそれよりも多くの文字を保持できますが、実際にファイルパスの結果を使用することはできません。

于 2010-07-19T00:03:09.087 に答える