要進行「網頁硬碟」功能設計,首先要熟悉.NET中處理檔案和資料夾的操作。 File類別和Directory類別是其中最主要的兩個類別。了解它們將對後面功能的實現提供很大的便利。
System.IO.File類別和System.IO.FileInfo類別
在設計和實作「網路硬碟」的過程中,將會大量使用和檔案系統操作相關的內容。故本節先對和檔案系統相關的兩個.NET類別進行簡要介紹。
System.IO.File類別和System.IO.FileInfo類別主要提供有關檔案的各種操作,在使用時需要引用System.IO命名空間。下面透過程式實例來介紹其主要屬性和方法。
(1) 文件開啟方法:File.Open
此方法的宣告如下:
public static FileStream Open(string path,FileMode mode)
下方的程式碼開啟存放在c:tempuploads目錄下名稱為newFile.txt文件,並在該文件中寫入hello。
private void OpenFile()
{
FileStream.TextFile=File.Open(@"c:tempuploadsnewFile.txt",FileMode.Append);
byte [] Info = {(byte)'h',(byte)'e',(byte)'l',(byte)'l',(byte)'o'};
TextFile.Write(Info,0,Info.Length);
TextFile.Close();
}
(2) 檔案建立方法:File.Create
此方法的宣告如下:
public static FileStream Create(string path;)
下面的程式碼示範如何在c:tempuploads下建立名為newFile.txt的檔案。
由於File.Create方法預設向所有使用者授予對新檔案的完全讀取/寫入存取權限,因此檔案是用讀取/寫入存取權限開啟的,並且必須關閉後才能由其他應用程式開啟。為此,所以需要使用FileStream類別的Close方法將所建立的檔案關閉。
private void MakeFile()
{
FileStream NewText=File.Create(@"c:tempuploadsnewFile.txt");
NewText.Close();
}
(3) 檔案刪除方法:File.Delete
此方法宣告如下:
public static void Delete(string path);
下面的程式碼示範如何刪除c:tempuploads目錄下的newFile.txt檔案。
private void DeleteFile()
{
File.Delete(@"c:tempuploadsnewFile.txt");
}
(4) 檔案複製方法:File.Copy
此方法宣告如下:
public static void Copy(string sourceFileName,string destFileName,bool overwrite);
下面的程式碼將c:tempuploadsnewFile.txt複製到c:tempuploads BackUp.txt。
由於Cope方法的OverWrite參數設為true,所以如果BackUp.txt檔案已存在的話,將會被複製過去的檔案所覆寫。
private void CopyFile()
{
File.Copy(@"c:tempuploadsnewFile.txt",@"c:tempuploadsBackUp.txt",true);
}
(5) 檔案移動方法:File.Move
此方法宣告如下:
public static void Move(string sourceFileName,string destFileName);
下面的程式碼可以將c:tempuploads下的BackUp.txt檔案移到c磁碟根目錄下。
注意:
只能在同一個邏輯磁碟下進行檔案轉移。如果試圖將c盤下的檔案轉移到d盤,將會發生錯誤。
private void MoveFile()
{
File.Move(@"c:tempuploadsBackUp.txt",@"c:BackUp.txt");
}
(6) 設定檔案屬性方法:File.SetAttributes
此方法宣告如下:
public static void SetAttributes(string path,FileAttributes fileAttributes);
下面的程式碼可以設定檔案c:tempuploadsnewFile.txt的屬性為唯讀、隱藏的屬性為唯讀、隱藏。
private void SetFile()
{
File.SetAttributes(@"c:tempuploadsnewFile.txt",
FileAttributes.ReadOnly|FileAttributes.Hidden);
}
檔案除了常用的唯讀和隱藏屬性外,還有Archive(檔案存檔狀態),System(系統檔案),Temporary(暫存檔案)等。關於檔案屬性的詳細情況請參考MSDN中FileAttributes的描述。
(7) 判斷檔案是否存在的方法:File.Exist
此方法宣告如下:
public static bool Exists(string path);
下面的程式碼判斷是否存在c:tempuploadsnewFile.txt檔案。若存在,先複製該文件,然後其刪除,最後將複製的文件移動;若不存在,則先創建該文件,然後打開該文件並進行寫入操作,最後將文件屬性設為唯讀、隱藏。
if(File.Exists(@"c:tempuploadsnewFile.txt")) //判斷檔案是否存在
{
CopyFile(); //複製檔案DeleteFile(); //刪除檔案MoveFile(); //移動檔案
}
else
{
MakeFile(); //產生檔案OpenFile(); //開啟檔案SetFile(); //設定檔案屬性
}
此外,File類別對於Text文字提供了更多的支援。
· AppendText:將文字追加到現有檔案
· CreateText:為寫入文字建立或開啟新檔案
· OpenText:開啟現有文字檔案以進行讀取
但上述方法主要對UTF-8的編碼文字進行操作,從而顯得不夠靈活。在這裡推薦讀者使用下面的程式碼對txt檔案進行操作。
· 對txt檔案進行「讀取」操作,範例程式碼如下:
StreamReader TxtReader = new StreamReader(@"c:tempuploadsnewFile.txt",System.Text.Encoding.Default);
string FileContent;
FileContent = TxtReader.ReadEnd();
TxtReader.Close();
· 對txt檔案進行「寫入」操作,範例程式碼如下:
StreamWriter = new StreamWrite(@"c:tempuploadsnewFile.txt",System.Text.Encoding.Default);
string FileContent;
TxtWriter.Write(FileContent);
TxtWriter.Close();
System.IO.Directory類別和System.DirectoryInfo類別
主要提供關於目錄的各種操作,使用時需要引用System.IO命名空間。下面透過程式實例來介紹其主要屬性和方法。
(1) 目錄建立方法:Directory.CreateDirectory
此方法宣告如下:
public static DirectoryInfo CreateDirectory(string path);
下面的程式碼示範在c:tempuploads資料夾下建立名為NewDirectory的目錄。
private void MakeDirectory()
{
Directory.CreateDirectory(@"c:tempuploadsNewDirectoty");
}
(2) 目錄屬性設定方法:DirectoryInfo.Atttributes
下面的程式碼設定c:tempuploadsNewDirectory目錄為唯讀、隱藏。與檔案屬性相同,目錄屬性也是使用FileAttributes來設定的。
private void SetDirectory()
{
DirectoryInfo NewDirInfo = new DirectoryInfo(@"c:tempuploadsNewDirectoty");
NewDirInfo.Atttributes = FileAttributes.ReadOnly|FileAttributes.Hidden;
}
(3) 目錄刪除方法:Directory.Delete
此方法宣告如下:
public static void Delete(string path,bool recursive);
下面的程式碼可以刪除c:tempuploadsBackUp目錄。 Delete方法的第二個參數為bool型別,它可以決定是否要刪除非空目錄。如果該參數值為true,將刪除整個目錄,即使該目錄下有檔案或子目錄;若為false,則僅當目錄為空時才可刪除。
private void DeleteDirectory()
{
Directory.Delete(@"c:tempuploadsBackUp",true);
}
(4) 目錄移動方法:Directory.Move
此方法宣告如下:
public static void Move(string sourceDirName,string destDirName);
下面的程式碼將目錄c:tempuploadsNewDirectory移到c:tempuploadsBackUp。
private void MoveDirectory()
{
File.Move(@"c:tempuploadsNewDirectory",@"c:tempuploadsBackUp");
}
(5) 取得目前目錄下的所有子目錄方法:Directory.GetDirectories
此方法宣告如下:
public static string[] GetDirectories(string path;);
下面的程式碼讀出c:tempuploads目錄下的所有子目錄,並將其儲存到字串數組中。
private void GetDirectory()
{
string [] Directorys;
Directorys = Directory. GetDirectories (@"c:tempuploads");
}
(6) 取得目前目錄下的所有文件方法:Directory.GetFiles
此方法宣告如下:
public static string[] GetFiles(string path;);
下面的程式碼讀出c:tempuploads目錄下的所有文件,並將其儲存到字串數組中。
private void GetFile()
{
string [] Files;
Files = Directory. GetFiles (@"c:tempuploads",);
}
(7) 判斷目錄是否存在方法:Directory.Exist
此方法宣告如下:
public static bool Exists(
string path;
);
下面的程式碼判斷是否存在c:tempuploadsNewDirectory目錄。若存在,先取得該目錄下的子目錄和文件,然後其移動,最後將移動後的目錄刪除。若不存在,則先建立該目錄,然後將目錄屬性設為唯讀、隱藏。
if(File.Exists(@"c:tempuploadsNewDirectory")) //判斷目錄是否存在
{
GetDirectory(); //取得子目錄GetFile(); //取得檔案MoveDirectory(); //行動目錄DeleteDirectory(); //刪除目錄
}
else
{
MakeDirectory(); //產生目錄SetDirectory(); //設定目錄屬性
}
注意:
路徑有3種方式,目前目錄下的相對路徑、目前工作盤的相對路徑、絕對路徑。以C:TmpBook為例(假定目前工作目錄為C:Tmp)。 “Book”,“TmpBook”,“C:TmpBook”都表示C:TmpBook。
另外,在C#中「」是特殊字符,要表示它的話需要使用「\」。由於這種寫法不方便,C#語言提供了@對其簡化。只要在字串前加上@即可直接使用“”。所以上面的路徑在C#中應該要表示為“Book”,@“TmpBook”,@“C:TmpBook”。