私は SaveFileDialog を使用しており、FileName に長い文字列 (longFileName) を設定する必要があります。文字列 longFileName は実行時に認識されます。
私が設定した場合
saveFileDialog.FileName = longFileName ;
それから私は得るSystem.IO.PathTooLongException
。
どうすればいいですか?
私は SaveFileDialog を使用しており、FileName に長い文字列 (longFileName) を設定する必要があります。文字列 longFileName は実行時に認識されます。
私が設定した場合
saveFileDialog.FileName = longFileName ;
それから私は得るSystem.IO.PathTooLongException
。
どうすればいいですか?
つまり、できません。NTFS のファイル名の最大サイズは 256 です。
私のアドバイスは、ファイル名を短くすることです。
260 文字を超えるファイル名を使用することはできますが、API で奇妙な問題が発生する可能性があります。また、.net は直接サポートしていません。
さらに詳しい情報が必要な場合は、この問題に関する BCL チーム ブログの 3 つの投稿のうち最初の投稿へのリンクを次に示します。 -net-part-1-of-3-kim-hamilton.aspx
答えは次のとおりです。
Q: ファイル名の最大文字数は何文字ですか?
A: これは、ファイルが FAT または NTFS パーティションに作成されているかどうかによって異なります。ファイル名の最大長は、NTFS パーティションでは 256 文字、FAT では 11 文字です (8 文字の名前、. 、3 文字の拡張子)。NTFS ファイル名は大文字と小文字を区別しますが、FAT ファイル名には大文字と小文字の概念がありません (ただし、NTFS で検索などを実行するときは大文字と小文字は無視されます)。256 文字のファイル名を持つ新しい VFAT もあります。
基本的に、アプリではなく OS が最大ファイル サイズを決定します。将来、より多くの文字をサポートするより優れたファイル システムがリリースされた場合は、それを許可し、現時点ではパスが長すぎる場合にユーザーに知らせることで、常にソフトウェアを上位互換にすることができます。ただし、現在の技術の進歩により、256 文字を超えるファイル名を使用することはできません。
次を使用して、ファイル名の短いパス バージョンを試すことができます。
[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();
できません。
Windows のパスは 256 文字未満にする必要があることに注意してください。(特別なトリックを使わない限り)
そもそもなぜそんなに長いファイル名が必要なのですか?
他の人が述べたように、この制限を回避する良い方法はありません。ただし、問題は NTFS ではなく、Win32にあります。SFU を使用すると、必要に応じて途方もなく長いパスを作成できますが、ネイティブの Win32 との相互運用性が興味深いものになります。
パスの先頭に \\?\ を追加してみてください。ただし、.NETでこれを試したことはありません。