2011-06-21 9 views
6

Estoy escribiendo un pequeño programa en C# que escanea una carpeta y abre los archivos que se crearon después de las 17.30 p. M. Después de presionar un botón en el programa . Esto también deberá buscar dentro de las subcarpetas.C# escanear una carpeta y abrir archivos que se crearon después de cierto tiempo

Necesito un par de soluciones para apuntarme en la dirección correcta ya que no estoy seguro de cómo lo haría.

Esto es parte de un programa de supervisión de carpetas. El problema es que cuando el usuario se va a casa, la PC se apaga y se crean archivos en el directorio después de las 17.30. De modo que necesito una forma para cuando el programa se reinicie por la mañana, detecta cualquier cosa creada después de las 17.30 y los abre.

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

Éste es mi código completo anterior. Me gustaría usar un botón para abrir o mostrar los archivos creados después de las 17.30.

Respuesta

19

Mire System.IO namespace, tiene todo lo que necesita.

DirectoryInfo y Las clases de archivo harán lo que usted desee.

+1

FileInfo/Directory.CreationTime para ser más precisos: http://msdn.microsoft.com/en-us/library/system.io.filesysteminfo.creationtime.aspx y http://msdn.microsoft.com/en-us /library/system.io.filesysteminfo.creationtime.aspx – RvdK

+2

@PoweRoy: bueno, no quería que sea demasiado fácil para él;) –

+3

Así que SO es prácticamente un lugar para hacer los deberes por usted. Al menos, estoy sintiendo eso cuando veo algunas de estas preguntas (personas con representantes de un solo dígito). – dpurrington

3

Puede usar FileSystemWatcher (MSDN documentation) para detectar archivos que se han creado después de presionar un botón (mientras la aplicación se está ejecutando).

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

Esto le permite rastrear los archivos a medida que se crean (mientras la aplicación se está ejecutando).

Si solo desea obtener una lista de todos los directorios que se crearon en un rango de tiempo específico (antes de que se iniciara su aplicación), puede buscar en el árbol de directorios usando Directory.GetDirectories y Directory.GetFiles.

+3

Esta es la forma correcta de obtener cambios en tiempo real, pero su pregunta parece que necesita hacer esto históricamente en lugar de tiempo real. – Nix

+0

Hola The Directory.Getdirectories and Directory.GetFiles parece ser lo que estoy buscando. – Matt

1

En lugar de datetime, coloque el valor de fecha y hora.

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

Aquí es el método recursivo que busca:

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

Esperanza ayudé.

+0

Gracias por la información, ¿cómo podría escribir esto con un botón? – Matt

+0

en el controlador de eventos del evento Click de su botón, llame a este método con directoryPath y DateTime deseados. es decir, 'var files = GetFilesCreatedAfter (folderBrowser.SelectedPath, new DateTime (2011,06,24,17,30,0)); ' –

Cuestiones relacionadas