1

私は SaveFileDialog を使用しており、FileName に長い文字列 (longFileName) を設定する必要があります。文字列 longFileName は実行時に認識されます。

私が設定した場合

saveFileDialog.FileName = longFileName ;

それから私は得るSystem.IO.PathTooLongException

どうすればいいですか?

4

7 に答える 7

5

つまり、できません。NTFS のファイル名の最大サイズは 256 です。

私のアドバイスは、ファイル名を短くすることです。

于 2009-12-01T15:03:29.573 に答える
4

260 文字を超えるファイル名を使用することはできますが、API で奇妙な問題が発生する可能性があります。また、.net は直接サポートしていません。

さらに詳しい情報が必要な場合は、この問題に関する BCL チーム ブログの 3 つの投稿のうち最初の投稿へのリンクを次に示します。 -net-part-1-of-3-kim-hamilton.aspx

于 2009-12-01T15:24:18.390 に答える
1

答えは次のとおりです。

Q: ファイル名の最大文字数は何文字ですか?

A: これは、ファイルが FAT または NTFS パーティションに作成されているかどうかによって異なります。ファイル名の最大長は、NTFS パーティションでは 256 文字、FAT では 11 文字です (8 文字の名前、. 、3 文字の拡張子)。NTFS ファイル名は大文字と小文字を区別しますが、FAT ファイル名には大文字と小文字の概念がありません (ただし、NTFS で検索などを実行するときは大文字と小文字は無視されます)。256 文字のファイル名を持つ新しい VFAT もあります。

ソース

基本的に、アプリではなく OS が最大ファイル サイズを決定します。将来、より多くの文字をサポートするより優れたファイル システムがリリースされた場合は、それを許可し、現時点ではパスが長すぎる場合にユーザーに知らせることで、常にソフトウェアを上位互換にすることができます。ただし、現在の技術の進歩により、256 文字を超えるファイル名を使用することはできません。

于 2009-12-01T15:03:48.493 に答える
1

次を使用して、ファイル名の短いパス バージョンを試すことができます。

  [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
  public static extern int GetShortPathName(
     [MarshalAs(UnmanagedType.LPTStr)] System.String path,
     [MarshalAs(UnmanagedType.LPTStr)] System.Text.StringBuilder shortPath,
     System.Int32 shortPathLength);

次に、ファイルの保存ダイアログは次のようになります。

     string long_path = @"C:\Program Files\Microsoft Visual Studio 8\Common7\Packages\Debugger\1033\vsdebugui.dll";
     StringBuilder s = new StringBuilder(long_path.Length);
     int short_path_length = GetShortPathName(long_path, s, long_path.Length);
     string short_path = s.ToString();
     SaveFileDialog save_d = new SaveFileDialog();
     save_d.FileName = short_path;
     save_d.ShowDialog();
于 2009-12-01T15:10:37.657 に答える
0

できません。

Windows のパスは 256 文字未満にする必要があることに注意してください。(特別なトリックを使わない限り)

そもそもなぜそんなに長いファイル名が必要なのですか?

于 2009-12-01T15:02:55.857 に答える
0

他の人が述べたように、この制限を回避する良い方法はありません。ただし、問題は NTFS ではなく、Win32にあります。SFU を使用すると、必要に応じて途方もなく長いパスを作成できますが、ネイティブの Win32 との相互運用性が興味深いものになります。

パスの先頭に \\?\ を追加してみてください。ただし、.NETでこれを試したことはありません。

于 2009-12-01T15:34:33.453 に答える