2011-06-21 27 views
6

Tôi đang viết một chương trình nhỏ trong C# quét một thư mục và mở các tệp đã được tạo sau 5.30 sau khi nhấn nút trên chương trình . Điều này cũng sẽ phải tìm kiếm trong các thư mục con.C# quét một thư mục và mở các tệp đã được tạo sau một thời gian nhất định

Tôi cần một vài giải pháp để chỉ cho tôi theo đúng hướng vì tôi không chắc chắn mình sẽ làm điều này như thế nào.

Đây là một phần của chương trình người theo dõi thư mục. Vấn đề là khi người dùng về nhà máy tính bị tắt và có những tập tin được tạo ra vào thư mục sau 17.30. Vì vậy, tôi cần một cách để khi chương trình được khởi động lại vào buổi sáng nó phát hiện bất cứ điều gì được tạo ra sau 17.30 và mở chúng.

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(); 
    } 
} 

Đây là mã hoàn chỉnh của tôi ở trên. Tôi muốn sử dụng nút để mở hoặc hiển thị các tệp được tạo sau 17.30.

Trả lời

19

Nhìn vào không gian tên System.IO, nó có mọi thứ bạn cần.

các DirectoryInfofile lớp sẽ làm những gì bạn muốn.

+1

FileInfo/Directory.CreationTime chính xác hơn: http://msdn.microsoft.com/en-us/library/system.io.filesysteminfo.creationtime.aspx và http://msdn.microsoft.com/en-us /library/system.io.filesysteminfo.creationtime.aspx – RvdK

+2

@PoweRoy: Tôi cũng không muốn làm cho nó dễ dàng cho anh ta;) –

+3

Vì vậy, SO là khá nhiều một nơi để có bài tập về nhà của bạn thực hiện cho bạn. Ít nhất, tôi nhận được cảm giác đó khi tôi xem xét một số câu hỏi này (những người có đại diện một chữ số). – dpurrington

3

Bạn có thể sử dụng FileSystemWatcher (MSDN documentation) để phát hiện tệp đã được tạo sau khi nhấn nút (trong khi ứng dụng của bạn đang chạy).

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

Điều này cho phép bạn theo dõi tệp khi chúng được tạo (trong khi ứng dụng của bạn đang chạy).

Nếu bạn chỉ muốn có danh sách tất cả các thư mục được tạo trong một khoảng thời gian cụ thể (trước khi ứng dụng của bạn được bắt đầu), bạn có thể tìm kiếm cây thư mục bằng cách sử dụng Directory.GetDirectoriesDirectory.GetFiles.

+3

Đây là cách chính xác để thay đổi thời gian thực, nhưng câu hỏi của anh có vẻ như anh cần phải làm điều này trong lịch sử so với thời gian thực. – Nix

+0

Xin chào Thư mục.Getdirectories và Directory.GetFiles dường như là những gì tôi đang tìm kiếm. – Matt

1

Thay cho vị trí ngày giờ bạn đặt giá trị ngày và giờ.

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

Dưới đây là phương pháp đệ quy bạn đang tìm kiếm:

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; 
} 

Hope tôi đã giúp.

+0

Cảm ơn bạn đã thông tin, làm thế nào tôi có thể viết điều này bằng cách sử dụng một nút. – Matt

+0

trong trình xử lý sự kiện của sự kiện Nhấp chuột của nút của bạn, hãy gọi phương thức này với thư mục mong muốnPath và DateTime. tức là 'var files = GetFilesCreatedAfter (folderBrowser.SelectedPath, DateTime mới (2011,06,24,17,30,0)); ' –

Các vấn đề liên quan