近期程序中經常用到一些文件的操作,現在大致整理一下。
一、 獲取文件或文件夾基本信息
1、獲取文件信息,組成一個DataTable信息。
/// <summary> /// 獲取指定目錄下,文件信息 /// </summary> /// <param name="path">絕對路徑</param> /// <returns></returns> public DataTable GetInfo(string path) { string fileName = "", fileType = "", capacity = "", editTime = "", dir = "", file = ""; DataTable dt = new DataTable(); dt.Columns.Add("fileName"); dt.Columns.Add("fileType"); dt.Columns.Add("capacity"); dt.Columns.Add("editTime"); dt.Columns.Add("dir"); dt.Columns.Add("file"); DirectoryInfo di = new DirectoryInfo(path); foreach (FileSystemInfo fsi in di.GetFileSystemInfos()) { DataRow nrow = dt.NewRow(); if (fsi is FileInfo)//如果是文件 { FileInfo fi = (FileInfo)fsi; fileName = fi.Name;//獲取文件名 file = fi.FullName;//獲取完整目錄 if (fi.Extension.Length < 1)//如果擴展名小於一 { fileType = ""; } else { fileType = fi.Extension.Remove(0, 1);//獲取文件擴展名 } dir = fi.Directory.ToString(); capacity = pub.FileCountSize(Convert.ToInt32(fi.Length.ToString()));//計算文件大小 editTime = fi.LastWriteTime.ToString();//獲取最后一次修改時間 } else //如果是文件夾 { di = (DirectoryInfo)fsi; fileName = di.Name; dir = di.FullName; file = ""; fileType = "文件夾"; capacity = ""; editTime = di.LastWriteTime.ToString(); } nrow["fileName"] = fileName; nrow["fileType"] = fileType; nrow["capacity"] = capacity; nrow["editTime"] = editTime; nrow["dir"] = dir; nrow["file"] = file; dt.Rows.Add(nrow); } dt.DefaultView.Sort = "editTime desc"; return dt; }
2、調用GetInfo方法,展示文件信息,結果如下

二、遞歸調用----復制文件到指定目錄
用到一功能,復制一個文件夾下的文件到另一個目錄下,文件夾下存在各種文件和文件夾
復制文件簡單直接用File.Copy()就行了,但是文件夾就比較難處理了,因為文件夾里面的內容不定,說不定有文件夾下還有文件夾,這就用到了遞歸
什么是遞歸函數/方法?
任何一個方法既可以調用其他方法也可以調用自己,而當這個方法調用自己時,我們就叫它遞歸函數或遞歸方法。
通常遞歸有兩個特點:
1. 遞歸方法一直會調用自己直到某些條件被滿足
2. 遞歸方法會有一些參數,而它會把一些新的參數值傳遞給自己。
/// <summary> /// 拷貝源文件的文件到新文件下(傳遞的參數路徑均為物理路徑) /// </summary> /// <param name="sourcePath">需要拷貝的源文件路徑</param> /// <param name="savePath">保存的目標文件路徑</param> /// <param name="isUpdate">如果文件已存在是否覆蓋</param> /// <returns>true:拷貝成功;false:拷貝失敗</returns> public bool CopyOldFilesToNew(string sourcePath, string savePath, bool isUpdate) { if (!Directory.Exists(savePath)) { Directory.CreateDirectory(savePath); } try { string[] labDirs = Directory.GetDirectories(sourcePath);//獲取文件夾目錄 string[] labFiles = Directory.GetFiles(sourcePath);//獲取文件目錄 if (labFiles.Length > 0) { for (int i = 0; i < labFiles.Length; i++) { if (isUpdate)//如果文件已存在,則覆蓋 { if (Path.GetFileName(labFiles[i]) != "wenshu.rar")//排除文件 { File.Copy(sourcePath + "\\" + Path.GetFileName(labFiles[i]), savePath + "\\" + Path.GetFileName(labFiles[i]), true); } } else//如果文件已存在則跳過 { if (Path.GetFileName(labFiles[i]) != "wenshu.rar" && !System.IO.File.Exists(savePath + "\\" + Path.GetFileName(labFiles[i])))//排除文件 { File.Copy(sourcePath + "\\" + Path.GetFileName(labFiles[i]), savePath + "\\" + Path.GetFileName(labFiles[i])); } } } } if (labDirs.Length > 0) { for (int j = 0; j < labDirs.Length; j++) { if (isUpdate)//如果文件已存在,則覆蓋 { if (Path.GetFileName(labDirs[j]) != "wenshu") { Directory.GetDirectories(sourcePath + "\\" + Path.GetFileName(labDirs[j])); //遞歸調用 CopyOldFilesToNew(sourcePath + "\\" + Path.GetFileName(labDirs[j]), savePath + "\\" + Path.GetFileName(labDirs[j]), isUpdate); } } else//如果文件已存在則跳過 { if (Path.GetFileName(labDirs[j]) != "wenshu" && !Directory.Exists(savePath + "\\" + Path.GetFileName(labDirs[j]))) { Directory.GetDirectories(sourcePath + "\\" + Path.GetFileName(labDirs[j])); //遞歸調用 CopyOldFilesToNew(sourcePath + "\\" + Path.GetFileName(labDirs[j]), savePath + "\\" + Path.GetFileName(labDirs[j]), isUpdate); } } } } } catch (Exception) { return false; } return true; }
程序調用
string path = Server.MapPath("../zfjl/lsh"); CopyOldFilesToNew(path, Server.MapPath("../zfjl/lsh/wenshu"), false);
三、整理一下常用的基本操作。
1、刪除指定文件
//file為絕對路徑 File.Delete(file);
2、拷貝文件
string sourceFile = @"c:\abc.txt";//源路徑 string targetFile = @"e:\temp\abc.txt";//目標路徑 bool iscover=true; // true=覆蓋已存在的同名文件,false則反之 System.IO.File.Copy(sourcePath,targetFile,iscover);
3、判斷文件夾是否存在,若不存在則創建。
if (!Directory.Exists(savePath)) { Directory.CreateDirectory(savePath); }
4、判斷文件是否存在
//file是文件路徑,為絕對路徑。例如:D:\abc.txt File.Exists(file)
