Get file size without using System.IO.FileInfo?

前端 未结 6 1549
[愿得一人]
[愿得一人] 2021-02-13 15:51

Is it possible to get the size of a file in C# without using System.IO.FileInfo at all?

I know that you can get other things like Name and

6条回答
  •  抹茶落季
    2021-02-13 16:08

    I performed a benchmark using these two methods:

        public static uint GetFileSizeA(string filename)
        {
            WIN32_FIND_DATA findData;
            FindFirstFile(filename, out findData);
            return findData.nFileSizeLow;
        }
    
        public static uint GetFileSizeB(string filename)
        {
            IntPtr handle = CreateFile(
                filename,
                FileAccess.Read,
                FileShare.Read,
                IntPtr.Zero,
                FileMode.Open,
                FileAttributes.ReadOnly,
                IntPtr.Zero);
            long fileSize;
            GetFileSizeEx(handle, out fileSize);
            CloseHandle(handle);
            return (uint) fileSize;
        }
    

    Running against a bit over 2300 files, GetFileSizeA took 62-63ms to run. GetFileSizeB took over 18 seconds.

    Unless someone sees something I'm doing wrong, I think the answer is clear as to which method is faster.

    Is there a way I can refrain from actually opening the file?

    Update

    Changing FileAttributes.ReadOnly to FileAttributes.Normal reduced the timing so that the two methods were identical in performance.

    Furthermore, if you skip the CloseHandle() call, the GetFileSizeEx method becomes about 20-30% faster, though I don't know that I'd recommend that.

提交回复
热议问题