Как проверить, является ли файл пустым в С#?
Мне нужно что-то вроде:
if (file is empty)
{
// do stuff
}
else
{
// do other stuff
}
Как проверить, является ли файл пустым в С#?
Мне нужно что-то вроде:
if (file is empty)
{
// do stuff
}
else
{
// do other stuff
}
Используйте FileInfo.Length:
if( new FileInfo( "file" ).Length == 0 )
{
// empty
}
Проверьте свойство Exists, чтобы узнать, существует ли файл вообще.
Проблема заключается в том, что файловая система нестабильна. Рассмотрим:
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 состоит в том, чтобы пересмотреть процесс использования блоков исключений, а затем добавить время разработки для написания хороших обработчиков исключений.
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;
}
Я обнаружил, что проверка поля FileInfo.Length не всегда работает для определенных файлов. Например, и пустой файл .pkgdef имеет длину 3. Поэтому мне пришлось фактически прочитать все содержимое файла и вернуть значение, равное пустой строке.
Вот как я решил проблему. Он проверяет, существует ли файл, а затем проверьте длину. Я бы счел несуществующий файл эффективным.
var info = new FileInfo(filename);
if ((!info.Exists) || info.Length == 0)
{
// file is empty or non-existant
}
В дополнение к ответу @tanascius вы можете использовать
try
{
if (new FileInfo("your.file").Length == 0)
{
//Write into file, i guess
}
}
catch (FileNotFoundException e)
{
//Do anything with exception
}
И он будет делать это только в том случае, если файл существует, в операторе catch вы можете создать файл и запустить код.
Что делать, если файл содержит пробел? 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
}
Вы можете использовать эту функцию, если ваш файл существует и всегда копируется в каталог отладки/выпуска.
/// <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;
}
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;
}