<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    風(fēng)人園

    弱水三千,只取一瓢,便能解渴;佛法無邊,奉行一法,便能得益。
    隨筆 - 99, 文章 - 181, 評(píng)論 - 56, 引用 - 0
    數(shù)據(jù)加載中……

    路徑,文件,目錄,I/O常見操作匯總

    摘要:
    ??? 文件操作是程序中非常基礎(chǔ)和重要的內(nèi)容,而路徑、文件、目錄以及I/O都是在進(jìn)行文件操作時(shí)的常見主題,這里想把這些常見的問題作個(gè)總結(jié),對(duì)于每個(gè)問題,盡量提供一些解決方案,即使沒有你想要的答案,也希望能提供給你一點(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)、刪除、重命名文件和目錄;
    ??? 四、讀寫文件,包括臨時(shí)文件,隨機(jī)文件名等;
    ??? 五、對(duì)文件系統(tǒng)的監(jiān)視;
    ??? 這一篇就先寫一下前兩部分。

    ??? 一、路徑相關(guān)操作
    ??? 問題1:如何判定一個(gè)給定的路徑是否有效/合法;
    ??? 解決方案:通過Path.GetInvalidPathChars或Path.GetInvalidFileNameChars方法獲得非法的路徑/文件名字符,可以
    ??? 根據(jù)它來判斷路徑中是否包含非法字符;

    ??? 問題2:如何確定一個(gè)路徑字符串是表示目錄還是文件;
    ???
    解決方案:
    ??? 1、使用Directory.Exists或File.Exist方法,如果前者為真,則路徑表示目錄;如果后者為真,則路徑表示文件;
    ??? 2、上面的方法有個(gè)缺點(diǎn)就是不能處理那些不存在的文件或目錄。這時(shí)可以考慮使用Path.GetFileName方法獲得
    ?????? 其包含的文件名,如果一個(gè)路徑不為空,而文件名為空那么它表示目錄,否則表示文件;

    ??? 問題3:如何獲得路徑的某個(gè)特定部分(如文件名、擴(kuò)展名等);
    ??? 解決方案:
    ??? 下面是幾個(gè)相關(guān)方法:
    ??? Path.GetDirectoryName :返回指定路徑字符串的目錄信息;
    ??? Path.GetExtension : 返回指定的路徑字符串的擴(kuò)展名;
    ??? Path.GetFileName : 返回指定路徑字符串的文件名和擴(kuò)展名;
    ??? Path.GetFileNameWithoutExtension :返回不具有擴(kuò)展名的路徑字符串的文件名;
    ??? Path.GetPathRoot :獲取指定路徑的根目錄信息;
    ??? (更多內(nèi)容還請(qǐng)參考MSDN)

    ??? 問題4:如何準(zhǔn)確地合并兩個(gè)路徑而不用去擔(dān)心那個(gè)煩人的”\”字符;
    ??? 解決方案:
    ??? 使用Path.Combine方法,它會(huì)幫你處理煩人的”\”;

    ??? 問題5:如何獲得系統(tǒng)目錄的的路徑(如桌面,我的文檔,臨時(shí)文件夾等);
    ??? 解決方案:
    ??? 主要是使用System. Environment類的相關(guān)屬性和方法:
    ??? Environment. SystemDirectory屬性:獲取系統(tǒng)目錄的完全限定路徑;
    ??? Environment. GetFolderPath方法:該方法接受的參數(shù)類型為Environment.SpecialFolder枚舉,
    ??? 通過這個(gè)方法可以獲得大量系統(tǒng)文件夾的路徑,如我的電腦,我的電腦,桌面,系統(tǒng)目錄等;
    ??? (更多內(nèi)容還請(qǐng)參考MSDN);
    ??? Path.GetTempPath方法:返回當(dāng)前系統(tǒng)的臨時(shí)文件夾的路徑;

    ??? 問題6:如何判斷一個(gè)路徑是絕對(duì)路徑還是相對(duì)路徑;
    ??? 解決方案:
    ??? 使用Path.IsPathRooted方法;

    ??? 問題7:如何讀取或設(shè)置當(dāng)前目錄;
    ??? 解決方案:
    ??? 使用Directory類的GetCurrentDirectory和SetCurrentDirectory方法;

    ??? 問題8:如何使用相對(duì)路徑;
    ??? 解決方案:
    ??? 設(shè)置當(dāng)前目錄后(見問題7),就可以使用相對(duì)路徑了。對(duì)于一個(gè)相對(duì)路徑,我們可以
    ??? 使用Path.GetFullPath方法獲得它的完全限定路徑(絕對(duì)路徑)。

    ??? 注意:如果打算使用相對(duì)路徑,建議你將工作目錄設(shè)置為各個(gè)交互文件的共同起點(diǎn),否則可能會(huì)引入
    ??? 一些不易發(fā)現(xiàn)的安全隱患,被惡意用戶利用來訪問系統(tǒng)文件。

    ??? 更多內(nèi)容:
    ??? 通常我們可以使用System.IO.Path類來處理路徑。該類提供了一套方法和屬性用于對(duì)包含文件或目錄路徑信息的字符串執(zhí)行操作,這些操作是以跨平臺(tái)的方式執(zhí)行的,而這些方法和屬性都是靜態(tài)的。

    ??? 注意路徑僅僅是提供文件或目錄位置的字符串。路徑不必指向磁盤上的位置,例如,路徑可以映射到內(nèi)存中或設(shè)備上的位置。路徑的準(zhǔn)確格式是由當(dāng)前平臺(tái)確定的。例如,在某些系統(tǒng)上,路徑可以驅(qū)動(dòng)器號(hào)或卷號(hào)開始,而此元素在其他系統(tǒng)中是不存在的。在某些系統(tǒng)上,文件路徑可以包含擴(kuò)展名,擴(kuò)展名指示在文件中存儲(chǔ)的信息的類型。文件擴(kuò)展名的格式是與平臺(tái)相關(guān)的;例如,某些系統(tǒng)將擴(kuò)展名的長度限制為 3 個(gè)字符,而其他系統(tǒng)則沒有這樣的限制。當(dāng)前平臺(tái)還確定用于分隔路徑中各元素的字符集,以及確定在指定路徑時(shí)不能使用的字符集。因?yàn)檫@些差異,所以 Path 類的字段以及 Path 類的某些成員的準(zhǔn)確行為是與平臺(tái)相關(guān)的。

    ??? 路徑可以包含絕對(duì)或相對(duì)位置信息。絕對(duì)路徑完整指定一個(gè)位置:文件或目錄可被唯一標(biāo)識(shí),而與當(dāng)前位置無關(guān)。相對(duì)路徑指定部分位置:當(dāng)定位用相對(duì)路徑指定的文件時(shí),當(dāng)前位置用作起始點(diǎn)。

    ??? Path類的大多數(shù)成員不與文件系統(tǒng)交互,并且不驗(yàn)證路徑字符串指定的文件是否存在。修改路徑字符串的Path 類成員(例如 ChangeExtension)對(duì)文件系統(tǒng)中文件的名稱沒有影響。但Path成員確實(shí)驗(yàn)證指定路徑字符串的內(nèi)容;并且如果字符串包含在路徑字符串中無效的字符(如 InvalidPathChars 中的定義),則引發(fā) ArgumentException異常。例如,在基于 Windows 的桌面平臺(tái)上,無效路徑字符可能包括引號(hào) (")、小于號(hào) (<)、大于號(hào) (>)、管道符號(hào) (|)、退格 (\b)、空 (\0) 以及從 16 到 18 和從 20 到 25的 Unicode 字符。

    ??? Path 類的成員使您可以快速方便地執(zhí)行常見操作,例如確定文件擴(kuò)展名是否是路徑的一部分,以及將兩個(gè)字符串組合成一個(gè)路徑名。

    ??? 多數(shù)情況下,如果這些方法接收了無效的路徑會(huì)拋出異常,但如果路徑名是因?yàn)榘送ㄅ浞?或?)從而無效,則不會(huì)拋出異常(可以使用GetInvalidPathChars方法來非法的路徑字符)。我們可以根據(jù)該原則判斷一個(gè)路徑是否合法。

    ? ??二、相關(guān)的通用文件對(duì)話框???

    ??? 1、文件夾瀏覽對(duì)話框(FolderBrowserDialog類)
    ??? 用戶可以通過該對(duì)話框?yàn)g覽、新建并選擇文件夾,如下圖:
    ???

    ??? 主要屬性:
    ??? Description:樹視圖控件上顯示的說明文本,如上圖中的”選擇要進(jìn)行計(jì)算的目錄”;
    ??? RootFolder:獲取或設(shè)置從其開始瀏覽的根文件夾,如上圖中設(shè)置的我的電腦(默認(rèn)為桌面);
    ??? SelectedPath:獲取或設(shè)置用戶選定的路徑,如果設(shè)置了該屬性,打開對(duì)話框時(shí)會(huì)定位到指定路徑,默認(rèn)為根文件夾,關(guān)閉對(duì)話框時(shí)根據(jù)該屬性獲取用戶用戶選定的路徑;
    ??? ShowNewFolderButton:獲取或設(shè)置是否顯示新建對(duì)話框按鈕;

    ??? 主要方法:
    ??? ShowDialog:打開該對(duì)話框,返回值為DialogResult類型值,如果為DialogResult.OK,則可以由SelectedPath屬性獲取用戶選定的路徑;

    ????dlgOpenFolder.Description?=?"選擇要進(jìn)行計(jì)算的目錄";
    ????dlgOpenFolder.RootFolder?
    =?Environment.SpecialFolder.MyComputer;
    ????dlgOpenFolder.ShowNewFolderButton?
    =?true;
    ????DialogResult?result?
    =?dlgOpenFolder.ShowDialog(this);
    ????
    if?(result?==?DialogResult.OK)
    ????{
    ????????txtDirPath.Text?
    =?dlgOpenFolder.SelectedPath;
    ????}

    ?

    ??? 2、打開文件對(duì)話框(OpenFileDialog類)
    ??? 用戶可以通過該對(duì)話框選擇一個(gè)文件,見下圖:
    ???

    ??? 主要屬性:
    ??? 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:打開用戶選定的具有只讀權(quán)限的文件;
    ??? ShowDialog:打開該模式對(duì)話框;
    ????dlgOpenFile.Title?=?"打開源文件";
    ????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類)
    ??? 用戶可以通過該對(duì)話框保存一個(gè)文件,見下圖:
    ???

    ??? 主要屬性:
    ??? 大部分與打開文件對(duì)話框類似,此處略過,下面幾個(gè)值得注意:
    ??? CreatePrompt:該值指示如果用戶指定不存在的文件,是否提示用戶允許創(chuàng)建該文件;
    ??? OverwritePrompt:該值指示如果用戶指定的文件名已存在,對(duì)話框是否顯示警告;
    ??? 主要方法:
    ??? OpenFile:打開用戶選定的具有讀/寫權(quán)限的文件;
    ??? ShowDialog:打開該模式對(duì)話框;
    ??? 示例代碼:

    ????dlgSaveFile.Title?=?"打開目標(biāo)文件";
    ????dlgSaveFile.InitialDirectory?
    =?@"C:\Inetpub\";
    ????dlgSaveFile.Filter?
    =?"文本文件?(*.txt)|*.txt|所有文件?(*.*)|*.*";
    ????dlgSaveFile.FilterIndex?
    =?2;
    ????DialogResult?dr?
    =?dlgSaveFile.ShowDialog();
    ????
    if?(dr?==?DialogResult.OK)
    ????{
    ???????
    string fileName = dlgSaveFile.FileName;
    ????}

    ??? 至此,我們操作的都只是路徑,要知道,這些路徑僅僅是字符串,還沒有涉及到文件系統(tǒng)中的真實(shí)文件。下一篇中會(huì)詳細(xì)了解有關(guān)文件和目錄的相關(guān)操作。



    摘要:
    ??? 文件操作是程序中非常基礎(chǔ)和重要的內(nèi)容,而路徑、文件、目錄以及I/O都是在進(jìn)行文件操作時(shí)的常見主題,這里想把這些常見的問題作個(gè)總結(jié),對(duì)于每個(gè)問題,盡量提供一些解決方案,即使沒有你想要的答案,也希望能提供給你一點(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)、刪除、重命名文件和目錄;
    ??? 四、讀寫文件,包括臨時(shí)文件,隨機(jī)文件名等;
    ??? 五、對(duì)文件系統(tǒng)的監(jiān)視;

    ??? 上一篇介紹了第一、二部分,這一篇介紹一下最重要的第三部分。
    ???
    ??? 三、文件和目錄相關(guān)操作
    ??? 文件和目錄操作涉及的類主要是:FileInfo,DirectoryInfo,DriveInfo,可以認(rèn)為它們的一個(gè)實(shí)例對(duì)應(yīng)著一個(gè)文件、目錄、驅(qū)動(dòng)器。它們的用法類似,一般是將文件、目錄或驅(qū)動(dòng)器的路徑作為參數(shù)傳遞給相應(yīng)的構(gòu)造函數(shù)創(chuàng)建一個(gè)實(shí)例,然后訪問它們的屬性和方法。
    ??? 注意下面幾點(diǎn):
    ??? FileInfo 類和 DirectoryInfo 類都繼承自抽象類 FileSystemInfo , FileSystemInfo 類定義了一些通用的屬性,如 CreationTime 、 Exists 等。但 DriveInfo 類沒有繼承 FileSystemInfo 類,所以它也就沒有上面提到的那些通用屬性了。

    ??? FileInfo 類和 DirectoryInfo 類的對(duì)象公開的屬性值都是第一次查詢時(shí)獲取的值,如果在以此查詢之后文件或目錄發(fā)生了改動(dòng),就必須調(diào)用它們的 Refresh 方法來更新這些屬性。但 DriveInfo 則無需這么做,它的屬性每次都會(huì)讀取文件系統(tǒng)最新的信息。

    ??? 在創(chuàng)建文件、目錄或驅(qū)動(dòng)器的實(shí)例時(shí),如果使用了一個(gè)不存在的路徑,并不會(huì)報(bào)錯(cuò),這是你得到一個(gè)對(duì)象,該對(duì)象表示一個(gè)并不存在的實(shí)體,這意味著它的 Exists 屬性(對(duì)于 DriveInfo 來說是 IsReady 屬性)值為 false 。你仍然可以操作該實(shí)體,但如果嘗試其它的大多數(shù)屬性,就會(huì)引發(fā)相應(yīng)的 FileNotFoundException 、 DirectoryNotFoundException 或 DriveNotFoundException 異常。

    ??? 另外,還可以使用 File / Directory 類,這兩個(gè)類的成員都是靜態(tài)方法,所以如果只想執(zhí)行一個(gè)操作,那么使用 File/Directory 中的靜態(tài)方法的效率比使用相應(yīng)的 FileInfo / DirectoryInfo中的 實(shí)例方法可能更高。所有的 File / Directory 方法都要求當(dāng)前所操作的文件 / 目錄的路徑。 注意: File / Directory 類的靜態(tài)方法對(duì)所有方法都執(zhí)行安全檢查。如果打算多次重用某個(gè)對(duì)象,可考慮改用 FileInfo / DirectoryInfo 的相應(yīng)實(shí)例方法,因?yàn)椴⒉豢偸切枰踩珯z查。 ?

    ??? 下面是一些常見的問題:
    ??? 問題1:如何獲取指定文件的基本信息;
    ??? 解決方案:可以使用FileInfo類的相關(guān)屬性:
    ??? FileInfo.Exists:獲取指定文件是否存在;
    ??? FileInfo.Name,F(xiàn)ileInfo.Extensioin:獲取文件的名稱和擴(kuò)展名;
    ??? FileInfo.FullName:獲取文件的全限定名稱(完整路徑);
    ??? FileInfo.Directory:獲取文件所在目錄,返回類型為DirectoryInfo;
    ??? FileInfo.DirectoryName:獲取文件所在目錄的路徑(完整路徑);
    ??? FileInfo.Length:獲取文件的大小(字節(jié)數(shù));
    ??? FileInfo.IsReadOnly:獲取文件是否只讀;
    ??? FileInfo.Attributes:獲取或設(shè)置指定文件的屬性,返回類型為FileAttributes枚舉,可以是多個(gè)值的組合(見問題2);
    ??? FileInfo.CreationTime、FileInfo.LastAccessTime、FileInfo.LastWriteTime:分別用于獲取文件的創(chuàng)建時(shí)間、訪問時(shí)間、修改時(shí)間;
    ??? (更多內(nèi)容還請(qǐng)參考MSDN)

    ??? 問題2:如何獲取和設(shè)置文件的屬性,比如只讀、存檔、隱藏等;
    ??? 解決方案:
    ??? 使用FileInfo.Attributes屬性可以獲取和設(shè)置文件的屬性,該屬性類型為FileAttributes枚舉,該枚舉的每個(gè)值表示一種屬性,F(xiàn)ileAttributes枚舉具有屬性(Attribute)FlagsAttribute,所以該枚舉的值可以進(jìn)行組合,也就是一個(gè)文件可以同時(shí)擁有多個(gè)屬性。下面看看具體的做法:
    ??? 獲取屬性,比如判斷一個(gè)文件是否是只讀的:

    ????//?當(dāng)文件具有其它屬性時(shí),這種做法會(huì)失敗
    ????if?(file.Attributes?==?FileAttributes.ReadOnly)
    ????{
    ????????chkReadonly.Checked?
    =?true;
    ????}

    ????
    //?這種寫法就不會(huì)有問題了,它只檢查只讀屬性
    ????if?((file.Attributes?&?FileAttributes.ReadOnly)?==?FileAttributes.ReadOnly)
    ????{
    ????????chkReadonly.Checked?
    =?true;
    ????}

    ??? 設(shè)置屬性,比如添加和移除一個(gè)文件的只讀屬性:

    ????if?(chkReadonly.Checked)
    ????{
    ????????
    //?添加只讀屬性
    ????????file.Attributes?|=?FileAttributes.ReadOnly;
    ????}
    ????
    else
    ????{
    ????????
    //?移除只讀屬性
    ????????file.Attributes?&=?~FileAttributes.ReadOnly;
    ????}

    ??? 問題3:如何獲取文件的版本信息(比如版本號(hào),版權(quán)聲明,公司名稱等);
    ??? 解決方案:
    ??? 使用FileVersionInfo類,該類有大量的版本信息相關(guān)的屬性。通過它的靜態(tài)方法GetVersionInfo獲得該類的一個(gè)實(shí)例,然后就可以訪問指定文件的版本信息了,非常方便。如FileVersion表示文件版本號(hào),LegalCopyright表示指定文件的版權(quán)聲明,CompanyName表示指定文件的公司名稱。(更多內(nèi)容還請(qǐng)參考MSDN)

    ??? 問題4:如何判斷兩個(gè)文件的內(nèi)容是否相同(精確匹配);
    ??? 解決方案:
    ??? 使用System.security.Cryptography.HashAlgorithm類為每個(gè)文件生成一個(gè)哈希碼,然后比較兩個(gè)哈希碼是否一致。
    ??? 在比較文件內(nèi)容的時(shí)候可以采用好幾種方法。例如,檢查文件的某一特定部分是否一致;如果愿意,你甚至可以逐字節(jié)讀取文件,逐字節(jié)進(jìn)行比較。這兩種方法都是可以的,但在某些情況下,還是使用哈希碼算法更為方便。
    ??? 該算法為一個(gè)文件生成一個(gè)小的(通常約為20字節(jié))二進(jìn)制”指紋”(binary fingerprint)。從統(tǒng)計(jì)學(xué)角度看,不同的文件不可能生成相同的哈希碼。事實(shí)上,即使是一個(gè)很小的改動(dòng)(比如,修改了源文件中的一個(gè)bit),也會(huì)有50%的幾率來改變哈希碼中的每一個(gè)bit。因此,哈希碼常常用于數(shù)據(jù)安全方面。
    ??? 要生成一個(gè)哈希碼,你必須首先創(chuàng)建一個(gè)HashAlgorithm對(duì)象,而這通常是調(diào)用HashAlgorithm.Create方法來完成的;然后調(diào)用HashAlgorithm.ComputeHash方法,它會(huì)返回一個(gè)存儲(chǔ)哈希碼的字節(jié)數(shù)組。代碼如下:

    ????///?<summary>
    ????
    ///?判斷兩個(gè)文件內(nèi)容是否一致
    ????
    ///?</summary>
    ????public?static?bool?IsFilesEqual(string?fileName1,?string?fileName2)
    ????{
    ????????
    using?(HashAlgorithm?hashAlg?=?HashAlgorithm.Create())
    ????????{
    ????????????
    using?(FileStream?fs1?=?new?FileStream(fileName1,?FileMode.Open),?fs2?=?new?FileStream(fileName2,?FileMode.Open))
    ????????????{
    ????????????????
    byte[]?hashBytes1?=?hashAlg.ComputeHash(fs1);
    ????????????????
    byte[]?hashBytes2?=?hashAlg.ComputeHash(fs2);

    ????????????????
    //?比較哈希碼
    ????????????????return?(BitConverter.ToString(hashBytes1)?==?BitConverter.ToString(hashBytes2));
    ????????????}
    ????????}
    ????}

    ??? 問題5:如何獲取指定目錄的基本信息;
    ??? 解決方案:可以使用DirectoryInfo類的相關(guān)屬性和方法:
    ??? DirectoryInfo.Exists:獲取指定目錄是否存在;
    ??? DirectoryInfo.Name:獲取目錄的名稱;
    ??? DirectoryInfo.FullName:獲取目錄的全限定名稱(完整路徑);
    ??? DirectoryInfo.Attributes:獲取或設(shè)置指定目錄的屬性,返回類型為FileAttributes枚舉,可以是多個(gè)值的組合;??
    ??? DirectoryInfo.CreationTime、FileInfo.LastAccessTime、FileInfo.LastWriteTime:分別用于獲取目錄的創(chuàng)建時(shí)間、訪問時(shí)間、修改時(shí)間;
    ??? DirectoryInfo.Parent:獲取目錄的上級(jí)目錄,返回類型為DirectoryInfo;
    ??? DirectoryInfo.Root:獲取目錄的根目錄,返回類型為DirectoryInfo;

    ??? 問題6:如何獲取指定目錄包含的文件和子目錄;
    ??? 解決方案:
    ??? DirectoryInfo.GetFiles():獲取目錄中(不包含子目錄)的文件,返回類型為FileInfo[],支持通配符查找;
    ??? DirectoryInfo.GetDirectories():獲取目錄(不包含子目錄)的子目錄,
    ??????? 返回類型為DirectoryInfo[],支持通配符查找;
    ??? DirectoryInfo. GetFileSystemInfos():獲取指定目錄下(不包含子目錄)的文件和子目錄,
    ??????? 返回類型為FileSystemInfo[],支持通配符查找;

    ??? 問題7:如何獲得指定目錄的大小;
    ??? 解決方案:
    ??? 檢查目錄內(nèi)的所有文件,利用FileInfo.Length屬性獲取每個(gè)文件的大小,然后進(jìn)行合計(jì),然后使用遞歸算法處理所有的子目錄的文件,參考下面代碼:

    ????///?<summary>
    ????
    ///?計(jì)算一個(gè)目錄的大小
    ????
    ///?</summary>
    ????
    ///?<param?name="di">指定目錄</param>
    ????
    ///?<param?name="includeSubDir">是否包含子目錄</param>
    ????
    ///?<returns></returns>
    ????private?long?CalculateDirSize(DirectoryInfo?di,?bool?includeSubDir)
    ????{
    ????????
    long?totalSize?=?0;

    ????????
    //?檢查所有(直接)包含的文件
    ????????FileInfo[]?files?=?di.GetFiles();
    ????????
    foreach?(FileInfo?file?in?files)
    ????????{
    ????????????totalSize?
    +=?file.Length;
    ????????}

    ????????
    //?檢查所有子目錄,如果includeSubDir參數(shù)為true
    ????????if?(includeSubDir)
    ????????{
    ????????????DirectoryInfo[]?dirs?
    =?di.GetDirectories();
    ????????????
    foreach?(DirectoryInfo?dir?in?dirs)
    ????????????{
    ????????????????totalSize?
    +=?CalculateDirSize(dir,?includeSubDir);
    ????????????}
    ????????}

    ????????
    return?totalSize;
    ????}

    ??? 問題8:如何使用通配符搜索指定目錄內(nèi)的所有文件;
    ??? 解決方案:
    ??? 使用DirectoryInfo.GetFiles方法的重載版本,它可以接受一個(gè)過濾表達(dá)式,返回FileInfo數(shù)組,另外它的參數(shù)還可以指定是否對(duì)子目錄進(jìn)行查找。如:

    ????dir.GetFiles("*.txt", SearchOption.AllDirectories);

    ??? 問題9:如何復(fù)制、移動(dòng)、重命名、刪除文件和目錄;
    ??? 解決方案:使用FileInfo和DirectoryInfo類。
    ??? 下面是FileInfo類的相關(guān)方法:
    ??? FileInfo.CopyTo:將現(xiàn)有文件復(fù)制到新文件,其重載版本還允許覆蓋已存在文件;
    ??? FileInfo.MoveTo:將指定文件移到新位置,并提供指定新文件名的選項(xiàng),所以可以用來重命名文件(而不改變位置);??? FileInfo.Delete:永久刪除文件,如果文件不存在,則不執(zhí)行任何操作;
    ??? FileInfo.Replace:使用當(dāng)前FileInfo對(duì)象對(duì)應(yīng)文件的內(nèi)容替換目標(biāo)文件,而且指定另一個(gè)文件名作為被替換文件的備份,微軟考慮實(shí)在周到。

    ??? 下面是DirectoryInfo類的相關(guān)方法:
    ??? DirectoryInfo.Create:創(chuàng)建指定目錄,如果指定路徑中有多級(jí)目錄不存在,該方法會(huì)一一創(chuàng)建;
    ??? DirectoryInfo.CreateSubdirectory:創(chuàng)建當(dāng)前對(duì)象對(duì)應(yīng)的目錄的子目錄;
    ??? DirectoryInfo.MoveTo:將目錄(及其包含的內(nèi)容)移動(dòng)至一個(gè)新的目錄,也可用來重命名目錄;
    ??? DirectoryInfo.Delete:刪除目錄(如果它存在的話)。如果要?jiǎng)h除一個(gè)包含子目錄的目錄,要使用它的重載版本,以指定遞歸刪除。

    ??? 注意到了沒有?DirectoryInfo類少了一個(gè)CopyTo方法,不過我們可以通過遞歸來實(shí)現(xiàn)這個(gè)功能:

    ????///?<summary>
    ????
    ///?復(fù)制目錄到目標(biāo)目錄
    ????
    ///?</summary>
    ????
    ///?<param?name="source">源目錄</param>
    ????
    ///?<param?name="destination">目標(biāo)目錄</param>
    ????public?static?void?CopyDirectory(DirectoryInfo?source,?DirectoryInfo?destination)
    ????{
    ????????
    //?如果兩個(gè)目錄相同,則無須復(fù)制
    ????????if?(destination.FullName.Equals(source.FullName))
    ????????{
    ????????????
    return;
    ????????}

    ????????
    //?如果目標(biāo)目錄不存在,創(chuàng)建它
    ????????if?(!destination.Exists)
    ????????{
    ????????????destination.Create();
    ????????}

    ????????
    //?復(fù)制所有文件
    ????????FileInfo[]?files?=?source.GetFiles();
    ????????
    foreach?(FileInfo?file?in?files)
    ????????{
    ????????????
    //?將文件復(fù)制到目標(biāo)目錄
    ????????????file.CopyTo(Path.Combine(destination.FullName,?file.Name),?true);
    ????????}

    ????????
    //?處理子目錄
    ????????DirectoryInfo[]?dirs?=?source.GetDirectories();
    ????????
    foreach?(DirectoryInfo?dir?in?dirs)
    ????????{
    ????????????
    string?destinationDir?=?Path.Combine(destination.FullName,?dir.Name);

    ????????????
    //?遞歸處理子目錄
    ????????????CopyDirectory(dir,?new?DirectoryInfo(destinationDir));
    ????????}
    ????}

    ?

    ??? 問題10:如何獲得計(jì)算機(jī)的所有邏輯驅(qū)動(dòng)器;
    ??? 解決方案:使用DriveInfo類(需要.NET 2.0)
    ??? DriveInfo.GetDrives():獲得計(jì)算機(jī)的所有邏輯驅(qū)動(dòng)器,返回類型為DriveInfo[];?

    ??? 問題11:如何獲取指定驅(qū)動(dòng)器的信息;
    ??? 解決方案:
    ??? DriveInfo.Name:獲取驅(qū)動(dòng)器的名稱(如C:\);
    ??? DriveInfo.DriveType:獲取驅(qū)動(dòng)器的類型(如Fixed,CDRom,Removable,Network等);
    ??? DriveInfo.DriveFormat:獲取驅(qū)動(dòng)器的格式(如NTFS,F(xiàn)AT32,CDFS,UDF等);
    ??? DriveInfo.IsReady:獲取驅(qū)動(dòng)器是否已準(zhǔn)備好,比如CD是否已放入CD驅(qū)動(dòng)器,如果驅(qū)動(dòng)器沒有準(zhǔn)備好,訪問其信息會(huì)引發(fā)IOException類型異常;
    ??? DriveInfo.AvailableFreeSpace:獲取驅(qū)動(dòng)器的可用空間;
    ??? DriveInfo.TotalFreeSpace:獲取驅(qū)動(dòng)器總的可用空間,它與AvailableFreeSpace的不同在于AvailableFreeSpace會(huì)磁盤配額的設(shè)置;
    ??? DriveInfo.TotalSize:獲取驅(qū)動(dòng)器總的空間;
    ??? DriveInfo.RootDirectory:獲得驅(qū)動(dòng)器的根目錄(DirectoryInfo類型);

    ??? 至此,我們已經(jīng)了解了文件和目錄相關(guān)的一些基本操作。但還不清楚如何去讀寫文件的內(nèi)容,下一篇中會(huì)詳細(xì)了解這方面的操作。?

    posted on 2007-03-09 10:47 風(fēng)人園 閱讀(600) 評(píng)論(0)  編輯  收藏 所屬分類: DotNet

    主站蜘蛛池模板: 国产精品免费一区二区三区| 免费国产成人高清在线观看麻豆| 青青青视频免费观看| 亚洲日韩乱码中文无码蜜桃臀 | 亚洲AV无码AV男人的天堂| 四虎影永久在线高清免费| 最近的中文字幕大全免费8| www一区二区www免费| 亚洲精品久久无码av片俺去也| 久久亚洲精精品中文字幕| 亚洲无线码在线一区观看| heyzo亚洲精品日韩| 成人午夜18免费看| 在线视频精品免费| 最好看的中文字幕2019免费| 日本中文字幕免费高清视频| 国产福利免费视频 | 日本xxwwxxww在线视频免费| 可以免费看黄视频的网站| 中国人xxxxx69免费视频| 人妻无码一区二区三区免费| a级毛片无码免费真人久久| h视频免费高清在线观看| 精品视频免费在线| 亚洲成a∧人片在线观看无码| 456亚洲人成影院在线观| 亚洲日本在线免费观看| 337p欧洲亚洲大胆艺术| 亚洲视频一区二区三区| 亚洲综合视频在线观看| 亚洲另类图片另类电影| 亚洲一区二区三区深夜天堂| 亚洲乱码中文字幕小综合| 亚洲综合色区中文字幕| 亚洲人成图片网站| 亚洲av永久中文无码精品综合 | 亚洲av日韩片在线观看| 亚洲 综合 国产 欧洲 丝袜| 亚洲AV无码乱码在线观看| 亚洲天堂中文字幕在线| 亚洲国产综合无码一区|