整理了文件夹的创建、清空和删除。以在目录E:\Other-shore下的项目WpfFile做测试。
首先定义了一个路径:可以使用绝对路径如:E:\Temp;这里使用的是相对路径,使用相对路径能提高程序的可移植性。
string root = "../../../Temp";
在C#中,相对路径使用“.”(代表当前目录)和“..”(代表上一级目录)表示:
【"./Temp"】等同于【"Temp"】等同于【AppDomain.CurrentDomain.SetupInformation.ApplicationBase+"Temp"】。都是在E:\Other-shore\WpfFile\WpfFile\bin\Debug下创建了Temp文件
若此时我想将Temp文件创建与WpfFile项目同一级的目录下,就该往上跳3级至“E:\Other-shore\WpfFile\Temp”即为【"../../../Temp"】
一、创建文件夹
/// <summary>
/// 创建文件夹
/// </summary>
/// <param name="root">文件夹如:(E:\Temp)</param>
public void CreatDirectory(string root)
{
if (!Directory.Exists(root))
Directory.CreateDirectory(root);
}
二、从指定路径删除目录
/// <summary>
/// 从指定路径删除目录
/// </summary>
/// <param name="root">文件目录如:(E:\Temp)</param>
public void DeletDirectory(string root)
{
if (!Directory.Exists(root))
Directory.Delete(root, true);//recursive:设为true删除 path 中的目录、子目录和文件
}
三、删除文件
在.Net中,对文件(File)和文件夹(Folder)的操作可以使用File类和Directory类,也可以使用FileInfo类和DirectoryInfo类.
/// <summary>
/// 删除文件
/// </summary>
/// <param name="filename">文件名</param>
public void DeleteFile(string filename)
{
if (File.Exists(filename))
{
FileInfo fileInfo = new FileInfo(filename);
if (fileInfo.Attributes.ToString().IndexOf("ReadOnly") != -1)
fileInfo.Attributes = FileAttributes.Normal;//若是只读文件需修改为标准文件
File.Delete(filename);
}
}
四、获取文件夹下所有文件和子目录名称
使用Directory.GetFileSystemEntries()方法
参数searchPattern:要与 path 中的文件和目录的名称匹配的搜索字符串,设为“*”匹配所有文件。
参数searchOption:TopDirectoryOnly--在搜索操作中包括仅当前目录;AllDirectories--在搜索操作中包括当前目录及其所有的子目录。
/// <summary>
/// 获取文件夹下所有文件和子目录名称
/// </summary>
/// <param name="root"></param>
public string[] GetItems(string root)
{
string[] items = Directory.GetFileSystemEntries(root, "*", SearchOption.TopDirectoryOnly);
return items;
}
五、清空文件夹
方法一、寻常删除
/// <summary>
/// 清空文件夹
/// </summary>
/// <param name="root">文件目录如:(E:\Temp)</param>
public void EmptyDirectory(string root)
{
string[] items = Directory.GetFileSystemEntries(root, "*", SearchOption.TopDirectoryOnly);
foreach (string ite in items)
{
if (File.Exists(ite))
DeleteFile(ite);
else
Directory.Delete(ite, true);
}
}
方法二、使用了linq,代码行数减少了,看上去更美观
/// <summary>
/// 清空文件夹
/// </summary>
/// <param name="root">文件目录如:(E:\Temp)</param>
public void EmptyDriectory2(string root)
{
Directory.GetFiles(root).ToList().ForEach(File.Delete);
Directory.GetDirectories(root).ToList().ForEach(x=>Directory.Delete(x,true));
}
六、复制文件
方法一、File.Copy
/// <summary>
/// File复制文件
/// </summary>
/// <param name="source">源文件的路径</param>
/// <param name="target">文件保存的路径</param>
private void CopyFile(string source, string target)
{
File.Copy(source, target,true);
}
方法二、FileInfo.CopyTo
private void CopyFile2(string source, string target)
{
FileInfo file = new FileInfo(source);
// true is overwrite
file.CopyTo(target, true);
}
方法三、Stream
/// <summary>
/// 文件流方式复制文件
/// </summary>
/// <param name="source">源文件的路径</param>
/// <param name="target">文件保存的路径</param>
/// <param name="eachReadLength">每次读取的长度(默认为1024*1024*5)</param>
public void CopyFileWithStream(string source, string target, int eachReadLength = 1024 * 1024 * 5)
{
//创建一个读取文件的流 使用using 可以自动释放资源
using (System.IO.FileStream fss = new System.IO.FileStream(source, FileMode.Open, FileAccess.Read))
{
//创建一个写入文件的流
using (System.IO.FileStream fst = new System.IO.FileStream(target, FileMode.OpenOrCreate, FileAccess.Write))
{
byte[] buf;
if (eachReadLength < fss.Length) //若源文件长度小于每次拷贝的文件长度,则将实际文件长度直接拷贝
{
buf = new byte[eachReadLength];
//因为文件比较大,所以用循环写入
while (true)
{
int intBy = fss.Read(buf, 0, buf.Length);
fss.Flush();
//如果返回的是0说明文件读取完成了
if (intBy == 0)
break;
//写入文件
fst.Write(buf, 0, intBy);
fst.Flush();
}
}
else
{
buf = new byte[fss.Length];
fss.Read(buf, 0, buf.Length);
fss.Flush();
fst.Write(buf, 0, buf.Length);
fst.Flush();
}
}
}
}
七、复制文件夹
/// <summary>
/// 复制文件夹
/// </summary>
/// <param name="srcPath">源文件夹</param>
/// <param name="targetPath">目标文件夹</param>
public static void CopyDirectory(string srcPath, string targetPath)
{
try
{
if (Directory.Exists(srcPath))
{
DirectoryInfo dir = new DirectoryInfo(srcPath);
FileSystemInfo[] fileinfo = dir.GetFileSystemInfos(); //获取目录下(不包含子目录)的文件和子目录
foreach (FileSystemInfo i in fileinfo)
{
if (i is DirectoryInfo) //判断是否文件夹
{
if (!Directory.Exists(targetPath + "\\" + i.Name))
{
Directory.CreateDirectory(targetPath + "\\" + i.Name); //目标目录下不存在此文件夹即创建子文件夹
}
CopyDirectory(i.FullName, targetPath + "\\" + i.Name); //递归调用复制子文件夹
}
else
{
File.Copy(i.FullName, targetPath + "\\" + i.Name, true); //不是文件夹即复制文件,true表示可以覆盖同名文件
}
}
}
}
catch (Exception e)
{
}
}