C ++ WinAPI:長いファイルパス/名前を処理する
-
17-09-2020 - |
質問
私のWindowsアプリケーションでのファイルパスを処理するのを見ています。
現在、私はユーザーが絶対ファイルパスを入力できるテキストボックス(編集ボックス)を持っています。その後、GetWindowText
を使用して、そのような宣言された文字列に型付きファイルパスを読みます。
明らかに、ここで私は260文字に制限するTCHAR FilePath[MAX_PATH];
定数に頼っています。そのため、ファイル/パスの名前を扱うには、このようにTCHAR配列を拡張するだけです.MAX_PATH
またはより良い方法はありますか?可変長配列を使用できますか?(TCHAR FilePath[32767];
これはC ++では可能ですか? - すみません、私はこれにかなり新しいことです)。
上級感ありがとうございました!
これは私が上記のもののコードスニペットです:
TCHAR FilePath[MAX_PATH];
ZeroMemory(&FilePath, sizeof(FilePath));
GetWindowText(hWndFilePath, FilePath, MAX_PATH);
. 解決
Windows上のファイルパスに関していくつかの制限があります。デフォルトでは、パスは260文字を超えることはできません。これはMAX_PATH
が定数のものです。
しかし、が長いパスにアクセスすることができます - 特定の制限を持つ - "\\?"でパスを接頭辞めることによって。ただし、「\\?」プレフィックスを使用することの制限は、通常、利益を上回る:
- この接頭辞を持つサポートパスをないWin32 APIがいくつあります(たとえば、
LoadLibrary
は常に260文字より長いパスで失敗する) です。
- Win32正規化規則は、 "\\?"の接頭辞を使用するときに有効になりません。たとえば、デフォルトでは、パス内の "/"は "\"、 ""に変換されます。そして、 ".."はそれぞれ現在のディレクトリと親ディレクトリへの参照に変換されます。 "\\?\"の接頭辞を使用すると起こりません。
- プログラムを変更することができるため、長いパスをサポートするために、作成したファイルを開くことができない可能性があります。これは、他のプログラムがでもを使用していない場合、 "\\?"の接頭辞を使用します。
正直になるために、ポイント#2は本当の殺人者です。そのルート
したがって、私の勧告は260の制限に固執するだけです。少なくともより長い経路のためのより良いプラットフォームサポートがあるまで。
他のヒント
あなたが書いているプログラムの種類によって異なります。私自身の戦略は通常、パス creation を長さのmax_pathに制限することでしたが、より長いパスから既存のデータを読むことができるようになりました( "\\?" prefix deanを使用して彼の答えに言及してください)。たとえば、バックアッププログラムは長いパスを受け入れる必要があり、入力として指定されたものを正確に再現する必要があります。
ディーンは確かにウィンドウがあなたのためのより長いパスを正確に正しく正しく修正している間、私はこれが一般的な規則として多くの関心事の大部分であることがわかっていません。これは一般的にパスを正確にするためのあなた自身のコードを書くことを意味するのではありません - それは一般的にそれは通常そものそのようなものを生成しない方法でパスを入力することを意味します。
いいえ、より長いパスを受けると、Windowsはそれを受け入れることができません。それで技術的には、あなたはあなたのバッファのそれよりも多くの文字を保持することができ、あなたは実際にはファイルパス結果を使用することはできません。