文件为空检查

时间:2010-06-09 16:15:50

标签: c#

如何在C#中检查文件是否为空?

我需要类似的东西:

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

else
{
    // do other stuff
}

9 个答案:

答案 0 :(得分:99)

使用FileInfo.Length

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

检查Exists属性以查找文件是否存在。

答案 1 :(得分:9)

这里的问题是文件系统是易失性的。考虑:

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场景所需的方法是重新考虑使用异常块的过程,然后将开发时间写入编写良好的异常处理程序。

答案 2 :(得分:6)

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

答案 3 :(得分:3)

我发现检查FileInfo.Length字段并不总是适用于某些文件。例如,空的.pkgdef文件的长度为3.因此,我必须实际读取文件的所有内容并返回是否等于空字符串。

答案 4 :(得分:2)

除了回答@tanascius之外,您还可以使用

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

只有当文件存在时才会这样做,在catch语句中你可以创建文件,然后运行代码agin。

答案 5 :(得分:2)

如果文件包含空格怎么办? 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
}

答案 6 :(得分:1)

这就是我解决问题的方法。它将首先检查文件是否存在,然后检查长度。我认为一个不存在的文件实际上是空的。

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

答案 7 :(得分:0)

如果您的文件存在并且始终复制到调试/发布目录,则可以使用此功能。

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

答案 8 :(得分:0)

FileInfo.Length 并非在所有情况下都有效,尤其是对于文本文件。如果您有一个以前具有某些内容的文本文件,现在已清除,则该长度可能仍然不是0,因为字节顺序标记可能仍然保留。

您可以通过以下方式重现该问题:创建一个文本文件,向其中添加一些Unicode文本,保存它,然后清除该文本并再次保存该文件。

现在 FileInfo.Length 将显示不为零的大小。

一个解决方案是根据byte order mark的最大大小来检查Length <6。如果您的文件可以容纳一个字节或几个字节,那么如果Length <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;
}