一个困扰我的问题,我想让程序在某个目录内自动删除超过1个月时间的子目录及子目录内文件的方法,最好能有代码,请各位路过的大哥大姐能帮助小弟。谢谢!

解决方案 »

  1.   


    string[] Log1FileName = Directory.GetFiles( 文件夹 ); // 获取文件夹中所有文件名 Collections.IEnumerator myEnum = Log1FileName.GetEnumerator();while ( myEnum1.MoveNext() )  // 枚举所有文件
    {
    System.IO.File.GetCreationTime(myEnum1.Current->ToString()); // 获取文件创建时间   
      
    }
      

  2.   

    上面代码只适用于单个文件夹,如果要遍历文件夹,参考以下代码:递归实现查找目录下的所有子目录和文件public   void   FindFile(string   dir)                           //参数为指定的目录
    {     
      //在指定目录及子目录下查找文件,在listBox1中列出子目录及文件
      DirectoryInfo   Dir=new   DirectoryInfo(dir);
      try
      {
          foreach(DirectoryInfo   d   in   Dir.GetDirectories())     //查找子目录   
           {
             FindFile(Dir+d.ToString()+"\\");
             listBox1.Items.Add(Dir+d.ToString()+"\\");       //listBox1中填加目录名
           }
          foreach(FileInfo   f   in   Dir.GetFiles("*.*"))             //查找文件
           {
             listBox1.Items.Add(Dir+f.ToString());     //listBox1中填加文件名
           }
      }
      catch(Exception   e)
      {
        MessageBox.Show(e.Message);
      }}
      

  3.   

    我觉得你描述得还不够清楚,“超过1个月”是创建时间还是最后修改或者访问时间?另外如果有这种情况:某子目录他创建时间超过一个月,但它下面有子目录或者文件没有超过一个月,删还是不删?你可以用DirectoryInfo和FileInfo的CreationTime属性来判断创建时间(还有LastAccessTime和LastWriteTime,你看着办吧),如果循环遍历某无限级目录的话就要用递归。
      

  4.   

    TO:hyblusea
    看了代码,不能满足我的需要,谢谢。
    下面我写的代码遇到删除某一子目录内有文件,就报错。谁能帮我改改,可以直接删除子目录及其内所有文件。            DirectoryInfo di = new DirectoryInfo(@"E:\Images");
                DirectoryInfo[] sudi = di.GetDirectories();
                DateTime dtNow = DateTime.Now;
                
                foreach (DirectoryInfo tmpdi in sudi)
                {
                    if (tmpdi.Name != null)
                    {
                        TimeSpan ts = dtNow.Subtract(tmpdi.LastWriteTime);
                        if (ts.TotalMinutes > 30)//距现在30分钟以上
                        {
                            tmpdi.Delete();//删除文件
                        }
                    }
                }TO:camperer
    不好意思,我没有表达清楚,删除的时间只以其子目录最后修改时间为准(也可以创建时间)。子目录里不再有子目录了,且其内仅是jpg后缀图像文件,不管jpg文件的创建时间。
      

  5.   

    加上判断是文件还是目录就可以,是目录继续递归,是文件直接操作就可以  private void GetFolders(string path)
            {
                string[] folders = Directory.GetDirectories(path);
                   
                foreach (string folder in folders)
                {
                    GetFiles(folder);
                    //递归调用搜索文件夹
                    GetFolders(folder);
                }     
            }
            //搜索path下的文件()
            private void GetFiles(string path)
            {
                string[] files = Directory.GetFiles(path, txtPatten.Text);           
                foreach (string file in files)
                {
                    lstFiles.Items.Add(file);//lst是一个ListBox的一个实例
                    lblFile.Text = file;
                }
               
            }
      

  6.   

    你仔细看看下面的代码吧。public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            DirectoryInfo di = new DirectoryInfo(@"E:\Images");
            DelFile(di);//此处一定要调用两次,具体原因自己体会
            DelFile(di);

        }
        protected void DelFile(DirectoryInfo Di)
        {
            
            FileSystemInfo[] Fsi = Di.GetFileSystemInfos();
            DateTime dtNow = DateTime.Now;
            for (int i = 0; i < Fsi.Length; i++)
            {
                if (Fsi[i].Exists)
                {
                    TimeSpan ts = dtNow.Subtract(Fsi[i].LastWriteTime);
                    
                    if (Fsi[i].GetType() == typeof(FileInfo))//如果是文件
                    {
                        if (ts.TotalMinutes > 1)//距现在30分钟以上
                        {
                            Fsi[i].Delete();//删除该文件
                        }
                    }
                    if (Fsi[i].GetType() == typeof(DirectoryInfo))//如果是文件夹
                    {
                        if (((DirectoryInfo)Fsi[i]).GetFileSystemInfos().Length == 0)//没有子文件或子文件夹
                        {
                            if (ts.TotalMinutes > 1)//距现在30分钟以上
                            {
                                Fsi[i].Delete();//直接删除文件夹
                            }
                        }
                        else if (((DirectoryInfo)Fsi[i]).GetFileSystemInfos().Length > 0)//包含有子文件或子文件夹
                        {
                            DelFile((DirectoryInfo)Fsi[i]);//递归函数本身
                        }
                    }
                   
                }
            }
        }
    }
      

  7.   

    上面函数第一次调用会递归删除过期的文件和文件夹,当第一次调用完后,会可能有空文件夹。所以要进行第二次调用。
    下面是修改过的函数
        protected void DelFile(DirectoryInfo Di) 
        { 
            
            FileSystemInfo[] Fsi = Di.GetFileSystemInfos(); 
            DateTime dtNow = DateTime.Now; 
            for (int i = 0; i < Fsi.Length; i++) 
            { 
                if (Fsi[i].Exists) 
                { 
                    TimeSpan ts = dtNow.Subtract(Fsi[i].LastWriteTime);                
                    if (Fsi[i].GetType() == typeof(FileInfo))//如果是文件 
                      { 
                        if (ts.TotalMinutes > 1)//距现在30分钟以上 
                            Fsi[i].Delete();//删除该文件 
                    } 
                    if (Fsi[i].GetType() == typeof(DirectoryInfo))//如果是文件夹 
                      { 
                        //没有子文件或子文件夹 
                        if (((DirectoryInfo)Fsi[i]).GetFileSystemInfos().Length == 0)
                           Fsi[i].Delete();//直接删除文件夹  
                        //包含有子文件或子文件夹  
                        else if (((DirectoryInfo)Fsi[i]).GetFileSystemInfos().Length > 0)
                            DelFile((DirectoryInfo)Fsi[i]);//递归函数本身 
                    } 
                  
                } 
            } 
        }
      

  8.   

    TO: fengling2001 
    谢谢回复。TO:mngzilin 
    我体会到了你的意思,是先把所有过期文件都删除,然后再在把空文件夹都删除,就达到我要的效果了,对吧。谢谢你的方法对我帮助很大。
    但是我的目录内会有很多的文件,是否影响电脑效率呢,不知道是否有其他方法?请各位大哥指导我一下,小弟感激不尽,如果没有,我准备结贴了。
      

  9.   

    有一个远古的dos外部命令 deltree.exe 你可以去下一个来,调用一下就可以
    deltree c:\a 
    把a目录删除,不管是不是空的
      

  10.   

    deltree c:\a  /y
    不提示yes no
      

  11.   

    #4楼:
    报的什么错?目录不是空的?
    把tmpdi.Delete()改为tmpdi.Delete(true)
      

  12.   

    TO:wartim
    谢谢你的提醒,我按照你的方法做了,            Process p = new Process();
                p.StartInfo.FileName = "cmd.exe";           
                p.StartInfo.Arguments = "/c " + command;    
                p.StartInfo.UseShellExecute = false;        
                p.StartInfo.RedirectStandardInput = true;   
                p.StartInfo.RedirectStandardOutput = true;  
                p.StartInfo.RedirectStandardError = true;   
                p.StartInfo.CreateNoWindow = true;         
                p.Start(); 
                return p.StandardOutput.ReadToEnd();  呵呵,不过我的系统为win server 2003,没有“deltree”,我用的“rd /s /q”测试成功。TO:camperer
    是的,报错为目录不是空。呵呵,谢谢提醒,加(true)之后马上解决问题。为了这个问题我绕了好大一圈啊。
    在这里感谢各位大哥的热情帮助,我以达到我需求的帖子平均给分结贴吧。再次感谢大家!