??? 文件操作是程序中非常基礎(chǔ)和重要的內(nèi)容,而路徑、文件、目錄以及I/O都是在進(jìn)行文件操作時(shí)的常見(jiàn)主題,這里想把這些常見(jiàn)的問(wèn)題作個(gè)總結(jié),對(duì)于每個(gè)問(wèn)題,盡量提供一些解決方案,即使沒(méi)有你想要的答案,也希望能提供給你一點(diǎn)有益的思路,如果你有好的建議,懇請(qǐng)能夠留言,使這些內(nèi)容更加完善。
??? 主要內(nèi)容:
??? 一、路徑的相關(guān)操作, 如判斷路徑是否合法,路徑類型,路徑的特定部分,合并路徑,系統(tǒng)文件夾路徑等內(nèi)容;
??? 二、相關(guān)通用文件對(duì)話框,這些對(duì)話框可以幫助我們操作文件系統(tǒng)中的文件和目錄;
??? 三、文件、目錄、驅(qū)動(dòng)器的操作,如獲取它們的基本信息,獲取和設(shè)置文件和目錄的屬性,文件的版本信息,
??????? 搜索文件和目錄,文件判等,復(fù)制、移動(dòng)、刪除、重命名文件和目錄;
??? 四、讀寫(xiě)文件,包括臨時(shí)文件,隨機(jī)文件名等;
??? 五、對(duì)文件系統(tǒng)的監(jiān)視;
??? 這一篇就先寫(xiě)一下前兩部分。
??? 一、路徑相關(guān)操作
??? 問(wèn)題1:如何判定一個(gè)給定的路徑是否有效/合法;
??? 解決方案:通過(guò)Path.GetInvalidPathChars或Path.GetInvalidFileNameChars方法獲得非法的路徑/文件名字符,可以
??? 根據(jù)它來(lái)判斷路徑中是否包含非法字符;
??? 問(wèn)題2:如何確定一個(gè)路徑字符串是表示目錄還是文件;
??? 解決方案:
??? 1、使用Directory.Exists或File.Exist方法,如果前者為真,則路徑表示目錄;如果后者為真,則路徑表示文件;
??? 2、上面的方法有個(gè)缺點(diǎn)就是不能處理那些不存在的文件或目錄。這時(shí)可以考慮使用Path.GetFileName方法獲得
?????? 其包含的文件名,如果一個(gè)路徑不為空,而文件名為空那么它表示目錄,否則表示文件;
??? 問(wèn)題3:如何獲得路徑的某個(gè)特定部分(如文件名、擴(kuò)展名等);
??? 解決方案:
??? 下面是幾個(gè)相關(guān)方法:
??? Path.GetDirectoryName :返回指定路徑字符串的目錄信息;
??? Path.GetExtension : 返回指定的路徑字符串的擴(kuò)展名;
??? Path.GetFileName : 返回指定路徑字符串的文件名和擴(kuò)展名;
??? Path.GetFileNameWithoutExtension :返回不具有擴(kuò)展名的路徑字符串的文件名;
??? Path.GetPathRoot :獲取指定路徑的根目錄信息;
??? (更多內(nèi)容還請(qǐng)參考MSDN)
??? 問(wèn)題4:如何準(zhǔn)確地合并兩個(gè)路徑而不用去擔(dān)心那個(gè)煩人的”\”字符;
??? 解決方案:
??? 使用Path.Combine方法,它會(huì)幫你處理煩人的”\”;
??? 問(wèn)題5:如何獲得系統(tǒng)目錄的的路徑(如桌面,我的文檔,臨時(shí)文件夾等);
??? 解決方案:
??? 主要是使用System. Environment類的相關(guān)屬性和方法:
??? Environment. SystemDirectory屬性:獲取系統(tǒng)目錄的完全限定路徑;
??? Environment. GetFolderPath方法:該方法接受的參數(shù)類型為Environment.SpecialFolder枚舉,
??? 通過(guò)這個(gè)方法可以獲得大量系統(tǒng)文件夾的路徑,如我的電腦,我的電腦,桌面,系統(tǒng)目錄等;
??? (更多內(nèi)容還請(qǐng)參考MSDN);
??? Path.GetTempPath方法:返回當(dāng)前系統(tǒng)的臨時(shí)文件夾的路徑;
??? 問(wèn)題6:如何判斷一個(gè)路徑是絕對(duì)路徑還是相對(duì)路徑;
??? 解決方案:
??? 使用Path.IsPathRooted方法;
??? 問(wèn)題7:如何讀取或設(shè)置當(dāng)前目錄;
??? 解決方案:
??? 使用Directory類的GetCurrentDirectory和SetCurrentDirectory方法;
??? 問(wèn)題8:如何使用相對(duì)路徑;
??? 解決方案:
??? 設(shè)置當(dāng)前目錄后(見(jiàn)問(wèn)題7),就可以使用相對(duì)路徑了。對(duì)于一個(gè)相對(duì)路徑,我們可以
??? 使用Path.GetFullPath方法獲得它的完全限定路徑(絕對(duì)路徑)。
??? 注意:如果打算使用相對(duì)路徑,建議你將工作目錄設(shè)置為各個(gè)交互文件的共同起點(diǎn),否則可能會(huì)引入
??? 一些不易發(fā)現(xiàn)的安全隱患,被惡意用戶利用來(lái)訪問(wèn)系統(tǒng)文件。
??? 更多內(nèi)容:
??? 通常我們可以使用System.IO.Path類來(lái)處理路徑。該類提供了一套方法和屬性用于對(duì)包含文件或目錄路徑信息的字符串執(zhí)行操作,這些操作是以跨平臺(tái)的方式執(zhí)行的,而這些方法和屬性都是靜態(tài)的。
??? 注意路徑僅僅是提供文件或目錄位置的字符串。路徑不必指向磁盤(pán)上的位置,例如,路徑可以映射到內(nèi)存中或設(shè)備上的位置。路徑的準(zhǔn)確格式是由當(dāng)前平臺(tái)確定的。例如,在某些系統(tǒng)上,路徑可以驅(qū)動(dòng)器號(hào)或卷號(hào)開(kāi)始,而此元素在其他系統(tǒng)中是不存在的。在某些系統(tǒng)上,文件路徑可以包含擴(kuò)展名,擴(kuò)展名指示在文件中存儲(chǔ)的信息的類型。文件擴(kuò)展名的格式是與平臺(tái)相關(guān)的;例如,某些系統(tǒng)將擴(kuò)展名的長(zhǎng)度限制為 3 個(gè)字符,而其他系統(tǒng)則沒(méi)有這樣的限制。當(dāng)前平臺(tái)還確定用于分隔路徑中各元素的字符集,以及確定在指定路徑時(shí)不能使用的字符集。因?yàn)檫@些差異,所以 Path 類的字段以及 Path 類的某些成員的準(zhǔn)確行為是與平臺(tái)相關(guān)的。
??? 路徑可以包含絕對(duì)或相對(duì)位置信息。絕對(duì)路徑完整指定一個(gè)位置:文件或目錄可被唯一標(biāo)識(shí),而與當(dāng)前位置無(wú)關(guān)。相對(duì)路徑指定部分位置:當(dāng)定位用相對(duì)路徑指定的文件時(shí),當(dāng)前位置用作起始點(diǎn)。
??? Path類的大多數(shù)成員不與文件系統(tǒng)交互,并且不驗(yàn)證路徑字符串指定的文件是否存在。修改路徑字符串的Path 類成員(例如 ChangeExtension)對(duì)文件系統(tǒng)中文件的名稱沒(méi)有影響。但Path成員確實(shí)驗(yàn)證指定路徑字符串的內(nèi)容;并且如果字符串包含在路徑字符串中無(wú)效的字符(如 InvalidPathChars 中的定義),則引發(fā) ArgumentException異常。例如,在基于 Windows 的桌面平臺(tái)上,無(wú)效路徑字符可能包括引號(hào) (")、小于號(hào) (<)、大于號(hào) (>)、管道符號(hào) (|)、退格 (\b)、空 (\0) 以及從 16 到 18 和從 20 到 25的 Unicode 字符。
??? Path 類的成員使您可以快速方便地執(zhí)行常見(jiàn)操作,例如確定文件擴(kuò)展名是否是路徑的一部分,以及將兩個(gè)字符串組合成一個(gè)路徑名。
??? 多數(shù)情況下,如果這些方法接收了無(wú)效的路徑會(huì)拋出異常,但如果路徑名是因?yàn)榘送ㄅ浞?或?)從而無(wú)效,則不會(huì)拋出異常(可以使用GetInvalidPathChars方法來(lái)非法的路徑字符)。我們可以根據(jù)該原則判斷一個(gè)路徑是否合法。? ??二、相關(guān)的通用文件對(duì)話框???
??? 1、文件夾瀏覽對(duì)話框(FolderBrowserDialog類)
??? 用戶可以通過(guò)該對(duì)話框?yàn)g覽、新建并選擇文件夾,如下圖:
???
??? 主要屬性:
??? Description:樹(shù)視圖控件上顯示的說(shuō)明文本,如上圖中的”選擇要進(jìn)行計(jì)算的目錄”;
??? RootFolder:獲取或設(shè)置從其開(kāi)始瀏覽的根文件夾,如上圖中設(shè)置的我的電腦(默認(rèn)為桌面);
??? SelectedPath:獲取或設(shè)置用戶選定的路徑,如果設(shè)置了該屬性,打開(kāi)對(duì)話框時(shí)會(huì)定位到指定路徑,默認(rèn)為根文件夾,關(guān)閉對(duì)話框時(shí)根據(jù)該屬性獲取用戶用戶選定的路徑;
??? ShowNewFolderButton:獲取或設(shè)置是否顯示新建對(duì)話框按鈕;
??? 主要方法:
??? ShowDialog:打開(kāi)該對(duì)話框,返回值為DialogResult類型值,如果為DialogResult.OK,則可以由SelectedPath屬性獲取用戶選定的路徑;
????dlgOpenFolder.RootFolder?=?Environment.SpecialFolder.MyComputer;
????dlgOpenFolder.ShowNewFolderButton?=?true;
????DialogResult?result?=?dlgOpenFolder.ShowDialog(this);
????if?(result?==?DialogResult.OK)
????{
????????txtDirPath.Text?=?dlgOpenFolder.SelectedPath;
????}
?
??? 2、打開(kāi)文件對(duì)話框(OpenFileDialog類)
??? 用戶可以通過(guò)該對(duì)話框選擇一個(gè)文件,見(jiàn)下圖:
???
??? CheckFileExists:該值指示如果用戶指定不存在的文件名,對(duì)話框是否顯示警告;
??? FileName(s):獲取或設(shè)置一個(gè)包含在文件對(duì)話框中選定的文件名的字符串;
??? Filter:獲取或設(shè)置對(duì)話框的文件類型列表;
??? FilterIndex:對(duì)話框的文件類型列表的索引(基于1的);
??? InitialDirectory:獲取或設(shè)置文件對(duì)話框顯示的初始目錄;
??? Multiselect:該值指示對(duì)話框是否允許選擇多個(gè)文件;
??? ShowReadOnly:該值指示對(duì)話框是否包含只讀復(fù)選框;
??? Title:獲取或設(shè)置文件對(duì)話框標(biāo)題;
??? 主要方法:
??? OpenFile:打開(kāi)用戶選定的具有只讀權(quán)限的文件;
??? ShowDialog:打開(kāi)該模式對(duì)話框;
????dlgOpenFile.InitialDirectory?=?@"C:\Inetpub\";
????dlgOpenFile.Filter?=?"文本文件?(*.txt)|*.txt|所有文件?(*.*)|*.*";
????dlgOpenFile.FilterIndex?=?2;
????dlgOpenFile.ShowReadOnly?=?true;
????DialogResult?dr?=?dlgOpenFile.ShowDialog();
????if?(dr?==?DialogResult.OK)
????{
??????? string fileName = dlgOpenFile.FileName;
????}
??? 3、保存文件對(duì)話框(SaveFileDialog類)
??? 用戶可以通過(guò)該對(duì)話框保存一個(gè)文件,見(jiàn)下圖:
???
??? 主要屬性:
??? 大部分與打開(kāi)文件對(duì)話框類似,此處略過(guò),下面幾個(gè)值得注意:
??? CreatePrompt:該值指示如果用戶指定不存在的文件,是否提示用戶允許創(chuàng)建該文件;
??? OverwritePrompt:該值指示如果用戶指定的文件名已存在,對(duì)話框是否顯示警告;
??? 主要方法:
??? OpenFile:打開(kāi)用戶選定的具有讀/寫(xiě)權(quán)限的文件;
??? ShowDialog:打開(kāi)該模式對(duì)話框;
??? 示例代碼:
????dlgSaveFile.InitialDirectory?=?@"C:\Inetpub\";
????dlgSaveFile.Filter?=?"文本文件?(*.txt)|*.txt|所有文件?(*.*)|*.*";
????dlgSaveFile.FilterIndex?=?2;
????DialogResult?dr?=?dlgSaveFile.ShowDialog();
????if?(dr?==?DialogResult.OK)
????{
??????? string fileName = dlgSaveFile.FileName;
????}
??? 至此,我們操作的都只是路徑,要知道,這些路徑僅僅是字符串,還沒(méi)有涉及到文件系統(tǒng)中的真實(shí)文件。下一篇中會(huì)詳細(xì)了解有關(guān)文件和目錄的相關(guān)操作。