【问题标题】:Is file empty check文件是否为空检查
【发布时间】:2021-03-26 09:25:28
【问题描述】:

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

我需要类似的东西:

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

else
{
    // do other stuff
}

【问题讨论】:

  • 我强烈建议您查看@tee-dee 下面的答案,它实际上提供了一种更准确的方法来确定文件是否真的为空,以防您处理文本文件。这里的大多数答案都是关于使用 FileInfo.Length 的,这是正确的,但在处理最终包含字节顺序标记 (BOM) 的文件时不要强调一个问题。

标签: c#


【解决方案1】:

使用FileInfo.Length:

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

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

【讨论】:

  • 测试过了。这正是我想要的。评级并打勾。谢谢
  • 注意:如果文件不存在,new FileInfo( "file" ).Length 将抛出 FileNotFoundException,因此如果文件不存在,请务必在检查 @ 之前检查 Exists 属性987654327@.
  • 帮了大忙。谢谢!
【解决方案2】:

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

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

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

对此的解决方案是根据byte order mark 可能的最大大小检查长度

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

【讨论】:

  • 惊讶地看到没有人关注这个答案,它提供了关于FileInfo.Length属性缺陷的急需有价值的信息,也是检查文件是否真的为空的好方法. +1。
【解决方案3】:

这里的问题是文件系统是不稳定的。考虑:

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

【讨论】:

  • 对于 OP 的程序,这些问题可能不是问题。 “完美是善的敌人。”
【解决方案4】:
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;
} 

【讨论】:

  • 由于您在第一个块中返回,因此您可以完全跳过 else 块。或者,您可以合并到else if。
【解决方案5】:

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

【讨论】:

  • 我在查看帖子时遇到了这个答案。欢迎,这是很好的第一篇文章。我可能会通过添加指向某些文档或其他资源的链接来增强它,以解释为什么您的答案是一个好的解决方案
【解决方案6】:

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

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

【讨论】:

    【解决方案7】:

    除了@tanascius 的回答,你还可以使用

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

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

    【讨论】:

    • 你不应该在你的 catch 语句中做这样的事情。
    【解决方案8】:

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

    【讨论】:

    • 您可以使用!IEnumerable.Any() 而不是IEnumerable.ToList().Count == 0。避免阅读整个列表。
    • 非常适合我!
    • FWIW,如果应用程序认为这样的文件是“空的”,那么它可能一开始就不应该这样写。写作过程应该在写作之前对内容进行适当的“修剪”。 (如果从任意来源读取文件,那么可能会有这样的空白内容 - 但恕我直言,通常最好在内存中处理,在读取文件之后 - 这是一个模糊的情况。)
    【解决方案9】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-03-31
      • 2011-05-03
      • 1970-01-01
      • 2019-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-14
      相关资源
      最近更新 更多