在C#中如何获取文件大小?

419
我需要一种使用C#获取文件大小而不是磁盘上大小的方法。这可能吗?
目前我有这个循环。
foreach (FileInfo file in downloadedMessageInfo.GetFiles())
{
    //file.Length (will this work)
}

这个代码会返回大小还是磁盘上的大小?


相关但是针对VB.NET的:*在VB.NET中确定文件大小*。 - Peter Mortensen
8个回答

575

如果您已经有一个文件路径作为输入,那么这是您需要的代码:

long length = new System.IO.FileInfo(path).Length;

6
请使用try/catch块包围它,并根据此处所述,检查所有可能的异常:SecurityException、UnauthorizedAccessException、PathTooLongException、NotSupportedException,以及-根据您的用例-ArgumentNullException和ArgumentException。请注意保持原意,同时使翻译更通俗易懂。 - huha

426

FileInfo.Length会返回文件的长度(以字节为单位,而不是磁盘上的大小),因此这正是您要查找的内容,我想。


6
同时,请参阅:http://social.msdn.microsoft.com/Forums/en-US/Vsexpressvcs/thread/85bf76ac-a254-41d4-a3d7-e7803c8d9bc3 这是一个关于如何获取“另一个值”的讨论,即磁盘上的大小。 - Marcin Deptuła
25
没有 "FileInfo.Length" 方法!请记住,您指定了调用静态方法。真正的答案是 new FileInfo(path).Length,但对于大规模操作可能会很繁重。 - Vincent
5
FWIW @Vincent - 是与否。FileInfo.Length 是属性名称,尽管它不是静态的。回答要根据代码而定。考虑通常如何执行“大规模操作”——通过目录信息:... new DirectoryInfo(...).GetFiles(); 会为您创建一个 FileInfo 集合。获取所有这些文件的 Length 是轻量级的。 - ToolmakerSteve
1
@ToolmakerSteve:微软文档是众所周知的垃圾,请不要将其称为“正常方式”。新手看到对静态方法的调用时会感到困惑,而显然该方法并不存在。GetFiles()只是获取文件列表的一种方式。名称可能是自动生成的(如“pic15.jpg”、“pic16.jpg”...),那么您每次都需要调用FileInfo。在任何情况下,操作系统都会缓存目录,并且获取长度绝不能像“创建对象”那样繁重——可以通过调用FileInfo.GetLength(string fileName)直接获取长度。这更方便,适用于许多临时任务。 - Vincent
2
@Viincent - “名称可以自动生成(例如“pic15.jpg”,“pic16.jpg”...)-然后您需要每次调用FileInfo。”对于“大规模操作”,这几乎从不必要。将所有文件路径的目录路径提取到HashSet中。 “我想知道一个静态方法,它可以给出文件的长度。您在哪个环境中,有FileInfo.GetLength?”无论是File还是FileInfo,Google或Intellisense都没有任何静态成员的命中,可以给出文件长度。 - ToolmakerSteve

44
< p > FileInfo.Length 将解决问题(据 MSDN 介绍,此方法“获取当前文件的大小(以字节为单位)”)。在 MSDN 上有一个关于常见 I/O 任务的不错的页面


13

MSDN FileInfo.Length中指出:“以字节为单位测量的当前文件大小。”

我通常在谷歌搜索类似问题时会搜索:msdn FileInfo


11

FileInfo类的Length属性返回文件的大小(而不是磁盘上的大小)。如果你想要一个格式化的文件大小(例如15 KB)而不是一个长字节值,你可以使用我制作的CSharpLib软件包,它添加了更多的功能到FileInfo类中。以下是一个示例:

using CSharpLib;
FileInfo info = new FileInfo("sample.txt");
Console.WriteLine(info.FormatBytes());  // Output: 15 MB

5
它返回文件内容的长度。

4

如果你将文件移动到另一个文件系统(FAT16、NTFS、EXT3等),磁盘上的大小可能会有所不同。

正如其他回答者所说,这将给出以字节为单位的大小,而不是磁盘上的大小。


-1
long l = new System.IO.FileInfo(path).Length;
string l_ = Formatter(l); // Example: "67 Mb"

//

public string Formatter(long input)
    {
        string output;
        switch (input.ToString().Length)
        {
            case > 12:
                output = input / 1000000000000 + " Tb";
                break;
            case > 9:
                output = input / 1000000000 + " Gb";
                break;
            case > 6:
                output = input / 1000000 + " Mb";
                break;
            case > 3:
                output = input / 1000 + " Kb";
                break;
            default:
                output = input + " b";
                break;
        }
        return output;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接