2011-06-21 11 views
6

C# içinde bir klasörü tarayan ve programa bir düğmeye basıldıktan sonra saat 15: 30'dan sonra oluşturulan dosyaları açan küçük bir program yazıyorum . Bu ayrıca alt klasörler içinde aramak zorunda kalacaktır.C# bir klasörü tara ve belirli bir süre sonra oluşturulmuş dosyaları aç

Bunu nasıl yapacağımı bilmediğimden emin olmak için doğru yöne işaret etmek için birkaç çözüme ihtiyacım var.

Bu, bir klasör izleyici programının bir parçasıdır. Sorun, kullanıcının eve gittiğinde PC kapanır ve 17.30'dan sonra dizine oluşturulan dosyalar vardır. Bu yüzden programın sabah yeniden başlatılmasının bir yoluna ihtiyacım var, 17.30'dan sonra yaratılan bir şeyi tespit ediyor ve açıyor.

private void button1_Click(object sender, EventArgs e) 
    { 
     folderBrowser.ShowDialog(); 

     textBox1.Text = folderBrowser.SelectedPath; 
     filewatcher.Path = textBox1.Text; 
     Registry.SetValue("HKEY_CURRENT_USER\\SOFTWARE\\COMPANY\\FOLDERWATCHER", "FOLDERPATH", textBox1.Text); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     String WatchFolder = Registry.GetValue("HKEY_CURRENT_USER\\SOFTWARE\\COMPANY\\FOLDERWATCHER", "FOLDERPATH", "").ToString(); 

     textBox1.Text = WatchFolder; 
     filewatcher.Path = WatchFolder; 
    } 

    private void Form1_Resize(object sender, EventArgs e) 
    { 
     if (WindowState == FormWindowState.Minimized) 
     { 
      ShowInTaskbar = true; 
      Hide(); 
     } 
    } 

    private void fileSystemWatcher1_Changed(object sender, System.IO.FileSystemEventArgs e) 
    { 
     if(!e.FullPath.EndsWith("temp.temp")) 
     { 
      MessageBox.Show("You have a Collection Form: " + e.Name); 
      Process.Start("explorer.exe", e.FullPath); 
     } 
    } 

    private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e) 
    { 
     Show(); 
    } 
} 

Bu, yukarıdaki tam kodum. 17.30'dan sonra oluşturulan dosyaları açmak veya göstermek için bir buton kullanmak istiyorum.

cevap

19

System.IO ad alanına bakın, ihtiyacınız olan her şeye sahiptir.

DirectoryInfo ve Dosya sınıfları ne istediğinizi yapacaklardır.

+1

FileInfo/Directory.CreationTime daha kesin: http://msdn.microsoft.com/en-us/library/system.io.filesysteminfo.creationtime.aspx ve http://msdn.microsoft.com/en-us /library/system.io.filesysteminfo.creationtime.aspx – RvdK

+2

@PoweRoy: ben onun için çok kolay olmasını istemedim;) –

+3

Öyleyse, SO ödevin senin için ödevini yapmak için oldukça uygun bir yer. En azından, bu soruların bazılarına baktığımda bu hissi alıyorum (tek haneli reps'li kişiler). – dpurrington

3

FileSystemWatcher (MSDN documentation) düğmelerini kullanarak, bir düğmeye bastıktan sonra (uygulamanız çalışırken) dosyaları tespit edebilirsiniz.

FileSystemWatcher watcher = new FileSystemWatcher(); 
watcher.Path = "C:\\YourDirectory"; 
watcher.Created += (sender, args) => { 
    // File was created 
} 
watcher.EnableRaisingEvents = true; 

Bu, dosyaları oluşturulduklarında (uygulamanız çalışırken) izlemenize olanak tanır.

Belirli bir zaman aralığında (uygulamanız başlamadan önce) oluşturulan tüm dizinlerin bir listesini almak isterseniz, Directory.GetDirectories ve Directory.GetFiles kullanarak dizin ağacında arama yapabilirsiniz.

+3

Gerçek zamanlı değişiklikler yapmanın doğru yolu budur, ancak bu soru, tarihsel olarak ve gerçek zamanlı olarak bunu yapması gerektiği gibi geliyor. – Nix

+0

Merhaba Directory.Getdirectories ve Directory.GetFiles aradığım şey gibi görünüyor. – Matt

1

Tarihin yerine, tarih ve saat değeri. Yardımcı oldum

public static List<string> GetFilesCreatedAfter(string directoryName, DateTime dt) 
{ 
    var directory = new DirectoryInfo(directoryName); 
    if (!directory.Exists) 
     throw new InvalidOperationException("Directory does not exist : " + directoryName); 
    var files = new List<string>(); 
    files.AddRange(directory.GetFiles().Where(n => n.CreationTime > dt).Select(n=>n.FullName)); 
    foreach (var subDirectory in Directory.GetDirectories(directoryName)) 
    { 
     files.AddRange(GetFilesCreatedAfter(subDirectory,dt)); 
    } 
    return files; 
} 

Umut:

void DirSearch(string dir) 
{ 
    try 
    { 
     foreach (string d in Directory.GetDirectories(dir)) 
     { 
      foreach (string f in Directory.GetFiles(d, "*.*")) 
      { 
       if(DateTime.Compare(f.GetCreationTime, datetime)) 
       { 
        //files found    
       } 
      } 
      DirSearch(d); 
     } 
    } 
    catch (System.Exception excpt) 
    { 
     Console.WriteLine(excpt.Message); 
    } 
} 
5

İşte aradığınız özyinelemeli yöntemdir.

+0

Bilgi için teşekkürler, bunu nasıl bir tuşla yazabilirim. Düğmenizdeki Click olayı olay işleyicisinde – Matt

+0

, bu dizini istenen directoryPath ve DateTime ile çağırın. yani, var files = GetFilesCreatedAfter (folderBrowser.SelectedPath, yeni DateTime (2011,06,24,17,30,0)); –

İlgili konular