c# - crear - como saber si un documento fue modificado
¿Cómo puedo verificar si el contenido de una carpeta fue cambiado? (5)
Necesito un procedimiento que compruebe si se agregaron nuevas carpetas / archivos a una carpeta seleccionada. Necesito este procedimiento para ejecutar en el inicio de la aplicación por lo que el tiempo de procesamiento en esta etapa es importante.
Supongo que puedo hacer un registro del estado actual, registro del estado anterior, ordenarlos y compararlos.
Primero necesito saber si hay otra forma.
En segundo lugar, si no hay otra forma, cuál es la mejor manera de encontrar la diferencia entre dos listas de rutas de archivos: tanto la estructura como los algoritmos.
Viejo estado:
c:/firstfolder/a.doc
c:/firstfolder/b.doc
c:/firstfolder/secondFolder/a.doc
c:/firstfolder/secondFolder/b.doc
Nuevo estado:
c:/firstfolder/a.doc
c:/firstfolder/b.doc
c:/firstfolder/secondFolder/a.doc
c:/firstfolder/secondFolder/b.doc
c:/firstfolder/secondFolder/c.doc
Estoy buscando c:/firstfolder/secondFolder/c.doc
.
Como su aplicación no se ejecuta continuamente, usar FileSystemWatcher no parece una buena opción para usted, pero sí quería mencionarlo, ya que podría generar algunas ideas de su parte.
Si tiene una lista del estado antiguo y crea una lista del nuevo estado, puede usar un algoritmo como el que se describe aquí para comparar las dos listas y determinar las adiciones y eliminaciones desde que se creó la primera lista. Esa respuesta aceptada al enlace provisto también tiene una buena solución que funciona muy bien si las listas no están ordenadas.
Creo que Sync Framework puede ser lo que estás buscando.
Creo que la mejor apuesta es recurrir a través del directorio y guardar el estado. Algo como esto:
public List<FileData> RecurseDirectory(string directory, int level, out int files, out int folders)
{
IntPtr INVALID_HANDLE_VALUE = new IntPtr(-1);
//long size = 0;
files = 0;
folders = 0;
WIN32_FIND_DATA findData;
List<FileData> list = new List<FileData>();
IntPtr findHandle;
// add global escape chars if not present.
if (directory.StartsWith(@"//?/"))
{
findHandle = FindFirstFile(directory + @"/*", out findData);
}
else
{
findHandle = FindFirstFile(@"//?/" + directory + @"/*", out findData);
}
if (findHandle != INVALID_HANDLE_VALUE)
{
//if file exists:
do
{
if ((findData.dwFileAttributes & FileAttributes.Directory) != 0)
{
//if it''s a directory:
if (findData.cFileName != "." && findData.cFileName != "..")
{
//increment folder counter.
folders++;
int subfiles, subfolders;
string subdirectory = directory + (directory.EndsWith(@"/") ? "" : @"/") +
findData.cFileName;
//Console.WriteLine("Dir:" + subdirectory);
//add it to list
String path = subdirectory;
FileData tempFileData = new FileData();
tempFileData.path = path;
tempFileData.fileProperties = findData;
list.Add(tempFileData);
//allows -1 to do complete search.
if (level != 0)
{
//recurse through to next subfolder
list.AddRange(RecurseDirectory(subdirectory, level - 1, out subfiles, out subfolders));
folders += subfolders;
files += subfiles;
}
}
}
else
{
// File
files++;
string subfile = directory + (directory.EndsWith(@"/") ? "" : @"/") +
findData.cFileName;
//Console.WriteLine("File:" + subfile);
//list.Add("File:" + subfile);
String path = subfile;
FileData t = new FileData();
t.path = path;
t.fileProperties = findData;
list.Add(t);
//size += (long)findData.nFileSizeLow + (long)findData.nFileSizeHigh * 4294967296L;
}
}
while (FindNextFile(findHandle, out findData));
FindClose(findHandle);
}
return list;
}
Después de esto, tendrás la lista del estado. Si tiene el estado antiguo en la lista también. Compara las listas Ahora.
Puede guardar información de tiempo del último estado. Entonces solo puede comparar los tiempos de creación de archivos y carpetas con eso. El siguiente código puede darte una idea:
foreach(FileInfo f in dir.GetFiles() {
if(f.CreationTime > dtLastState ) {
//do some interesting stuff
}
}
Editar: Esta no es una respuesta completa. No puede obtener los archivos eliminados con este código.
Puedes usar la clase FileSystemWatcher , creo que está haciendo exactamente lo que buscas.