C#文件夹操作

整理了文件夹的创建、清空和删除。以在目录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)
    {
                
    }
}

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值