2009-12-01 35 views
1

我正在使用SaveFileDialog,並且必須在FileName中設置長字符串(longFileName)。字符串longFileName在運行時已知。如何在SaveFileDialog的默認FileName中設置長字符串(> 260)?

如果我設置

saveFileDialog.FileName = longFileName ; 

然後我得到System.IO.PathTooLongException

我該怎麼辦?

+0

使用「文件名」,是指全名,包括其路徑或只是相對於其父文件夾的名稱? – MSalters 2009-12-02 11:07:53

回答

6

底線是......你不能,NTFS的最大文件名大小爲256.我的建議是縮短文件名。

0

你不能。

請記住,Windows中的路徑必須少於256個字符。 (除非你使用特殊技巧)

爲什麼你想要這樣一個長文件名在第一位?

1

答案就在下面:

問:什麼是文件名可以是文字的最大值是多少?

答:這取決於是否在FAT或NTFS分區上創建文件。 NTFS分區上的最大文件名長度是256個字符,FAT上有11個字符(8個字符名稱,。,3個字符擴展名)。 NTFS文件名保持不變,而FAT文件名沒有大小寫概念(但在NTFS上執行搜索時忽略該情況)。新的VFAT也有256個字符文件名。

Source

基本上,OS確定的最大文件大小,而不是你的應用程序。如果未來發布支持更多字符的更好的文件系統,您可以始終通過允許您的軟件向前兼容,並讓用戶知道現在路徑太長的時間。但是,隨着當前技術的進步,您不能使用大於256個字符的文件名。

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(); 
0

正如其他人所提到的,這個限制沒有什麼好辦法。但是,問題不在於NTFS,它在Win32中。如果你真的想使用SFU,你可以做出一些荒謬的長路徑,但是它使得原生Win32的東西變得有趣。

您可能想嘗試將路徑加上\\?\。雖然我從未嘗試過使用.NET。

0

\\?\添加到路徑的開頭。因此D:\<very_long_path>將變成\\?\D:\<very_long_path>。請參閱參考「最大路徑長度限制」http://msdn.microsoft.com/en-us/library/aa365247.aspx

+0

'File.Create(@「\\?\」+ filePath,(int)file.Value.Length)'>是否正確?我無法在很長時間內在文件夾中創建文件! PathTooLongException異常 – ridermansb 2012-05-11 17:14:03