2010-06-09 21 views

Respuesta

83

Uso FileInfo.Length:

if(new FileInfo("file").Length == 0) 
{ 
    // empty 
} 

comprobar la propiedad Exists para averiguar, si el archivo existe en absoluto.

+0

Probado. Eso es exactamente lo que quiero. calificado y marcado. Gracias – Arcadian

+2

nota: 'new FileInfo (" file ") .Length' lanzará una' FileNotFoundException' si el archivo no existe, por lo que si hay un caso de que el archivo no existe, asegúrese de marcar la propiedad 'Existe' antes de verificar 'Longitud'. –

+0

Gran ayuda. ¡Gracias! – snapper

5
if (!File.Exists(FILE_NAME)) 
    { 
     Console.WriteLine("{0} does not exist.", FILE_NAME); 
     return; 
    } 
    else 
    { 
     if (new FileInfo(FILE_NAME).Length == 0) 
     { 
      Console.WriteLine("{0} is empty", FILE_NAME); 
      return; 

     } 

    } 
+4

Como regresa en su primer bloque, puede omitir el bloque else por completo. O bien, puedes unirte a 'else if'. –

+1

declaración verdadera. – Mike

+0

Muy útil, muchas gracias. – OammieR

9

El problema aquí es que el sistema de archivos es volátil. Considere:

if (new FileInfo(name).Length > 0) 
{ //another process or the user changes or even deletes the file right here 

    // More code that assumes and existing, empty file 
} 
else 
{ 


} 

Esto puede ocurrir y sucede. En general, la forma en que necesita manejar escenarios de archivo-io es volver a pensar el proceso para usar bloques de excepciones, y luego poner su tiempo de desarrollo en escribir buenos manejadores de excepciones.

+4

Para el programa OP, estos problemas pueden no ser una preocupación. "Lo perfecto es el enemigo de lo bueno." – Brian

+0

buen punto. clasificado – Arcadian

0
//You can use this function, if your file exists as content, and is always copied to your debug/release directory. 

    /// <summary> 
    /// Include a '/' before your filename, and ensure you include the file extension, ex. "/myFile.txt" 
    /// </summary> 
    /// <param name="filename"></param> 
    /// <returns>True if it is empty, false if it is not empty</returns> 
    private Boolean CheckIfFileIsEmpty(string filename) 
    { 
     var fileToTest = new FileInfo(Environment.CurrentDirectory + filename); 
     return fileToTest.Length == 0; 
    } 
1

Así es como he resuelto el problema. Verificará si el archivo existe primero y luego verificará la longitud. Considero que un archivo inexistente está efectivamente vacío.

var info = new FileInfo(filename); 
if ((!info.Exists) || info.Length == 0) 
{ 
    // file is empty or non-existant  
} 
1

Además de responder de @tanascius, puede utilizar

try 
{ 
    if (new FileInfo("your.file").Length == 0) 
    { 
     //Write into file, i guess  
    } 
} 
catch (FileNotFoundException e) 
{ 
    //Do anything with exception 
} 

Y lo hará sólo si el archivo existe, en la sentencia catch puede crear archivos y Agin ejecutar código.

+1

No debe hacer algo como eso en su declaración catch. – UrbanEsc

2

He descubierto que comprobar el campo FileInfo.Length no siempre funciona para ciertos archivos. Por ejemplo, y el archivo .pkgdef vacío tiene una longitud de 3. Por lo tanto, tuve que leer realmente todos los contenidos del archivo y devolver si eso era igual a una cadena vacía.

+0

Me encontré con esta respuesta al revisar publicaciones. Bienvenido, esta es la primera publicación buena. Lo mejoraría añadiendo un enlace a alguna documentación u otro recurso que explique por qué tu respuesta es una buena solución –

1

¿Qué pasa si el archivo contiene espacio? FileInfo("file").Length es igual a 2.
Pero creo que el archivo también está vacío (no tiene ningún contenido excepto espacios (o saltos de línea)).

He usado algo como esto, pero ¿alguien tiene una mejor idea?
Puede ayudar a alguien.

string file = "file.csv"; 
var fi = new FileInfo(file); 
if (fi.Length == 0 || 
    (fi.Length < 100000 
    && !File.ReadAllLines(file) 
     .Where(l => !String.IsNullOrEmpty(l.Trim())).Any())) 
{ 
    //empty file 
} 
+2

En lugar de 'IEnumerable.ToList(). Count == 0' puedes usar'! IEnumerable.Any() ' . Evite leer toda la lista. –

+0

sí, claro, gracias @ JérémieBertrand –

Cuestiones relacionadas