Estoy buscando una forma de ver cuándo se modificó por última vez un archivo en C#. Tengo acceso completo al archivo.Comprobando cuándo se modificó por última vez un archivo en C# en Windows OS
Respuesta
System.IO.File.GetLastWriteTime es lo que necesita.
o posiblemente incluso [System.IO.File.GetLastWriteTimeUtc] (https://msdn.microsoft.com/en-us/library/system.io.file.getlastwritetimeutc (v = vs.110) .aspx) –
Simplemente use File.GetLastWriteTime. Hay una muestra en esa página que muestra cómo usarlo.
Simplemente desea el método estático File.GetLastWriteTime
.
Ejemplo:
DateTime lastModified = System.IO.File.GetLastWriteTime("C:\foo.bar");
Console.WriteLine(lastModified.ToString("dd/MM/yy HH:mm:ss"));
Votación a favor tomarse el tiempo para incluir un ejemplo de código. – PhilNicholas
Tenga en cuenta que la función File.GetLastWriteTime no siempre funciona como se esperaba, los valores son a veces no se actualizan instantáneamente por el sistema operativo. Puede obtener una marca de tiempo anterior, incluso si el archivo se ha modificado justo antes.
El comportamiento puede variar entre las versiones del sistema operativo. Por ejemplo, esta prueba de unidad funcionó bien siempre en mi máquina de desarrollo, pero siempre falla en nuestro servidor de compilación.
[TestMethod]
public void TestLastModifiedTimeStamps()
{
var tempFile = Path.GetTempFileName();
var lastModified = File.GetLastWriteTime(tempFile);
using (new FileStream(tempFile, FileMode.Create, FileAccess.Write, FileShare.None))
{
}
Assert.AreNotEqual(lastModified, File.GetLastWriteTime(tempFile));
}
Ver File.GetLastWriteTime seems to be returning 'out of date' value
Sus opciones:
a) vivir con las omisiones ocasionales.
b) Cree un componente activo realizando el patrón del observador (por ejemplo, una estructura de cliente de servidor tcp), comunicando los cambios directamente en lugar de escribir/leer archivos. Rápido y flexible, pero otra dependencia y un posible punto de falla (y algo de trabajo, por supuesto).
c) Asegure el proceso de señalización reemplazando el contenido de un archivo de señal dedicado que otros procesos leen regularmente. No es tan inteligente ya que es un procedimiento de votación y tiene una sobrecarga mayor que llamar a File.GetLastWriteTime, pero si no se comprueba el contenido de demasiados lugares con demasiada frecuencia, hará el trabajo.
/// <summary>
/// type to set signals or check for them using a central file
/// </summary>
public class FileSignal
{
/// <summary>
/// path to the central file for signal control
/// </summary>
public string FilePath { get; private set; }
/// <summary>
/// numbers of retries when not able to retrieve (exclusive) file access
/// </summary>
public int MaxCollisions { get; private set; }
/// <summary>
/// timespan to wait until next try
/// </summary>
public TimeSpan SleepOnCollisionInterval { get; private set; }
/// <summary>
/// Timestamp of the last signal
/// </summary>
public DateTime LastSignal { get; private set; }
/// <summary>
/// constructor
/// </summary>
/// <param name="filePath">path to the central file for signal control</param>
/// <param name="maxCollisions">numbers of retries when not able to retrieve (exclusive) file access</param>
/// <param name="sleepOnCollisionInterval">timespan to wait until next try </param>
public FileSignal(string filePath, int maxCollisions, TimeSpan sleepOnCollisionInterval)
{
FilePath = filePath;
MaxCollisions = maxCollisions;
SleepOnCollisionInterval = sleepOnCollisionInterval;
LastSignal = GetSignalTimeStamp();
}
/// <summary>
/// constructor using a default value of 50 ms for sleepOnCollisionInterval
/// </summary>
/// <param name="filePath">path to the central file for signal control</param>
/// <param name="maxCollisions">numbers of retries when not able to retrieve (exclusive) file access</param>
public FileSignal(string filePath, int maxCollisions): this (filePath, maxCollisions, TimeSpan.FromMilliseconds(50))
{
}
/// <summary>
/// constructor using a default value of 50 ms for sleepOnCollisionInterval and a default value of 10 for maxCollisions
/// </summary>
/// <param name="filePath">path to the central file for signal control</param>
public FileSignal(string filePath) : this(filePath, 10)
{
}
private Stream GetFileStream(FileAccess fileAccess)
{
var i = 0;
while (true)
{
try
{
return new FileStream(FilePath, FileMode.Create, fileAccess, FileShare.None);
}
catch (Exception e)
{
i++;
if (i >= MaxCollisions)
{
throw e;
}
Thread.Sleep(SleepOnCollisionInterval);
};
};
}
private DateTime GetSignalTimeStamp()
{
if (!File.Exists(FilePath))
{
return DateTime.MinValue;
}
using (var stream = new FileStream(FilePath, FileMode.Open, FileAccess.Read, FileShare.None))
{
if(stream.Length == 0)
{
return DateTime.MinValue;
}
using (var reader = new BinaryReader(stream))
{
return DateTime.FromBinary(reader.ReadInt64());
};
}
}
/// <summary>
/// overwrites the existing central file and writes the current time into it.
/// </summary>
public void Signal()
{
LastSignal = DateTime.Now;
using (var stream = new FileStream(FilePath, FileMode.Create, FileAccess.Write, FileShare.None))
{
using (var writer = new BinaryWriter(stream))
{
writer.Write(LastSignal.ToBinary());
}
}
}
/// <summary>
/// returns true if the file signal has changed, otherwise false.
/// </summary>
public bool CheckIfSignalled()
{
var signal = GetSignalTimeStamp();
var signalTimestampChanged = LastSignal != signal;
LastSignal = signal;
return signalTimestampChanged;
}
}
Algunas pruebas para ello:
[TestMethod]
public void TestSignal()
{
var fileSignal = new FileSignal(Path.GetTempFileName());
var fileSignal2 = new FileSignal(fileSignal.FilePath);
Assert.IsFalse(fileSignal.CheckIfSignalled());
Assert.IsFalse(fileSignal2.CheckIfSignalled());
Assert.AreEqual(fileSignal.LastSignal, fileSignal2.LastSignal);
fileSignal.Signal();
Assert.IsFalse(fileSignal.CheckIfSignalled());
Assert.AreNotEqual(fileSignal.LastSignal, fileSignal2.LastSignal);
Assert.IsTrue(fileSignal2.CheckIfSignalled());
Assert.AreEqual(fileSignal.LastSignal, fileSignal2.LastSignal);
Assert.IsFalse(fileSignal2.CheckIfSignalled());
}
- 1. Comprobar cuándo se modificó por última vez la contraseña
- 2. ¿Cómo obtengo la hora en que se modificó por última vez un archivo en Python?
- 3. SQL Server 2000: ¿Hay alguna forma de saber cuándo se modificó por última vez un registro?
- 4. ¿Cómo puedo determinar cuándo se modificó por última vez una tabla InnoDB?
- 5. svn: ¿Cómo determino la última vez que se modificó una determinada línea?
- 6. ¿Cómo saber cuándo se actualizó por última vez una página web?
- 7. ¿Puedo obtener la fecha cuando se modificó un archivo HTTP?
- 8. Comprobando que existe un archivo en C
- 9. ¿Cómo verificar cuándo se realiza el crecimiento automático por última vez?
- 10. ¿Cómo puedo averiguar cuándo un procedimiento almacenado fue modificado por última vez o compilado en Oracle?
- 11. Android check cuando la tabla se actualizó por última vez
- 12. ¿Cuándo se fue a dormir mi computadora la última vez? Ventana 7
- 13. Comprobando la versión del archivo en Ruby en Windows
- 14. ¿Cómo se puede saber cuándo un usuario presionó por última vez una tecla (o movió el mouse)?
- 15. jquery elemento centrado por última vez
- 16. Dentro de un ciclo while, ¿se garantiza que la última declaración separada por comas se ejecutará la última vez?
- 17. ¿Alguna vez podremos eliminar un archivo abierto en Windows?
- 18. ¿Cuándo se crea por primera vez un archivo de preferencias compartidas?
- 19. Cómo saber cuándo se actualizó una tabla de Oracle la última vez
- 20. comprobando invariantes en C++
- 21. ¿Cómo borrar la última línea en un archivo de texto?
- 22. La última vez que se ejecutó un procedimiento almacenado
- 23. ¿Cómo ordenar archivos por última vez modificada en ruby?
- 24. Script Bash: determine si se modificó el archivo.
- 25. Averigüe dónde se estableció por última vez una variable de entorno en bash
- 26. Comprobando si un archivo se abrió correctamente con ifstream
- 27. ¿Quién decide por última vez cuál es el tipo genérico?
- 28. ¿Cuándo es necesario "extern C" en C++ en Windows?
- 29. En vim, ¿cómo puedo abrir un archivo en el mismo número de línea que cerré por última vez?
- 30. Comprobar cuándo se realizó la última comprobación de Actualizaciones de Windows
posible duplicado de [Cómo obtener la fecha de modificación del archivo en C#] (http://stackoverflow.com/questions/1185378/how-to-get -modified-date-from-file-in-c-sharp) – nawfal
El problema en el enlace anterior es para casos más específicos, pero estoy de acuerdo: la respuesta aceptada aquí se menciona en esa pregunta. – Candyfloss