Подтвердить что ты не робот

Проверка файла

Как проверить, является ли файл пустым в С#?

Мне нужно что-то вроде:

if (file is empty)
{
    // do stuff
}

else
{
    // do other stuff
}
4b9b3361

Ответ 1

Используйте FileInfo.Length:

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

Проверьте свойство Exists, чтобы узнать, существует ли файл вообще.

Ответ 2

Проблема заключается в том, что файловая система нестабильна. Рассмотрим:

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
{


}

Это может и происходит. Как правило, способ обработки сценариев file-io состоит в том, чтобы пересмотреть процесс использования блоков исключений, а затем добавить время разработки для написания хороших обработчиков исключений.

Ответ 3

if (!File.Exists(FILE_NAME))
{
    Console.WriteLine("{0} does not exist.", FILE_NAME);
    return;
}

if (new FileInfo(FILE_NAME).Length == 0)  
{  
    Console.WriteLine("{0} is empty", FILE_NAME);
    return;
} 

Ответ 4

Я обнаружил, что проверка поля FileInfo.Length не всегда работает для определенных файлов. Например, и пустой файл .pkgdef имеет длину 3. Поэтому мне пришлось фактически прочитать все содержимое файла и вернуть значение, равное пустой строке.

Ответ 5

Вот как я решил проблему. Он проверяет, существует ли файл, а затем проверьте длину. Я бы счел несуществующий файл эффективным.

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

Ответ 6

В дополнение к ответу @tanascius вы можете использовать

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

И он будет делать это только в том случае, если файл существует, в операторе catch вы можете создать файл и запустить код.

Ответ 7

Что делать, если файл содержит пробел? FileInfo("file").Length равно 2.
Но я думаю, что файл также пуст (отсутствует контент, кроме пробелов (или разрывов строк)).

Я использовал что-то вроде этого, но кто-нибудь имеет лучшую идею? Может помочь кому-то.

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
}

Ответ 8

Вы можете использовать эту функцию, если ваш файл существует и всегда копируется в каталог отладки/выпуска.

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

Ответ 9

FileInfo.Length не будет работать во всех случаях, особенно для текстовых файлов. Если у вас есть текстовый файл, в котором раньше было какое-то содержимое, и теперь он очищен, длина может все еще не быть 0, поскольку метка порядка байтов все еще может сохраняться.

Вы можете воспроизвести проблему, создав текстовый файл, добавив в него текст Unicode, сохранив его, а затем очистив текст и снова сохранив файл.

Теперь FileInfo.Length покажет размер, который не равен нулю.

Решением для этого является проверка длины & lt; 6, исходя из максимально возможного размера для метки порядка байтов. Если ваш файл может содержать один или несколько байтов, выполните чтение файла, если длина & lt; 6 и проверьте размер прочитанного == 0.

public static bool IsTextFileEmpty(string fileName)
{
    var info = new FileInfo(fileName);
    if (info.Length == 0)
        return true;

    // only if your use case can involve files with 1 or a few bytes of content.
    if (info.Length < 6)
    {
        var content = File.ReadAllText(fileName);   
        return content.Length == 0;
    }
    return false;
}