c# 文件系统

c# 复制代码
using System.Runtime.InteropServices;
using static DiskInfo.FileSystemInfo;

namespace DiskInfo
{
    internal class Program
    {
        static void Main(string[] args)
        {
            try
            {
                try
                {
                    string path = args.Length > 0 ? args[0] : "."; // 默认当前目录
                    FileSystemStats info = GetFileSystemInfo(path);

                    Console.WriteLine($"tsize: {info.tsize}");
                    Console.WriteLine($"bsize: {info.bsize}");
                    Console.WriteLine($"blocks: {info.blocks}");
                    Console.WriteLine($"bfree: {info.bfree}");
                    Console.WriteLine($"bavail: {info.bavail}");
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
                Console.WriteLine("end");
                Console.ReadLine();
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Error: {ex.Message}");
            }
        }
    }

    class FileSystemInfo
    {
        // 定义结构体
        public class FileSystemStats
        {
            public uint tsize;  // 最佳传输大小
            public uint bsize;  // 文件系统块大小
            public ulong blocks; // 总块数
            public ulong bfree;  // 空闲块数
            public ulong bavail; // 可用块数(非特权用户)
        }

        // Windows API
        [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        private static extern bool GetDiskFreeSpaceEx(
            string lpDirectoryName,
            out ulong lpFreeBytesAvailable,
            out ulong lpTotalNumberOfBytes,
            out ulong lpTotalNumberOfFreeBytes);

        // Linux API
        [DllImport("libc", SetLastError = true)]
        private static extern int statvfs(string path, out StatVfs buf);

        private class StatVfs
        {
            public ulong f_bsize;  // 文件系统块大小
            public ulong f_frsize; // 片段大小
            public ulong f_blocks; // 总块数
            public ulong f_bfree;  // 空闲块数
            public ulong f_bavail; // 可用块数(非特权用户)
            public ulong f_files;  // 总文件节点数
            public ulong f_ffree;  // 空闲文件节点数
            public ulong f_favail; // 可用文件节点数(非特权用户)
            public ulong f_fsid;   // 文件系统 ID
            public ulong f_flag;   // 挂载标志
            public ulong f_namemax;// 最大文件名长度
        }

        // 获取文件系统信息
        public static FileSystemStats GetFileSystemInfo(string path)
        {
            if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
            {
                return GetWindowsFileSystemInfo(path);
            }
            else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
            {
                return GetLinuxFileSystemInfo(path);
            }
            else
            {
                throw new PlatformNotSupportedException("Unsupported platform.");
            }
        }

        // 获取 Windows 文件系统信息
        private static FileSystemStats GetWindowsFileSystemInfo(string path)
        {
            if (!GetDiskFreeSpaceEx(path, out ulong freeBytesAvailable, out ulong totalNumberOfBytes, out ulong totalNumberOfFreeBytes))
            {
                throw new Exception("Failed to get disk space information.");
            }

            var info = new FileSystemStats
            {
                tsize = 4096, // 假设最佳传输大小为 4KB
                bsize = 4096, // 假设块大小为 4KB
                blocks = totalNumberOfBytes / 4096,
                bfree = totalNumberOfFreeBytes / 4096,
                bavail = freeBytesAvailable / 4096
            };

            return info;
        }

        // 获取 Linux 文件系统信息
        private static FileSystemStats GetLinuxFileSystemInfo(string path)
        {
            if (statvfs(path, out StatVfs buf) != 0)
            {
                throw new Exception("Failed to get filesystem information.");
            }

            var info = new FileSystemStats
            {
                tsize = (uint)buf.f_bsize, // 最佳传输大小
                bsize = (uint)buf.f_bsize, // 块大小
                blocks = buf.f_blocks,     // 总块数
                bfree = buf.f_bfree,       // 空闲块数
                bavail = buf.f_bavail      // 可用块数(非特权用户)
            };

            return info;
        }
    }
}
相关推荐
程序员海军26 分钟前
一个 AI 应用开发程序员的一天,都在屏幕前忙些什么?
前端·后端·程序员
不能放弃治疗35 分钟前
MCP
后端
江湖十年2 小时前
Go 语言中 YAML to JSON 踩坑笔记
后端·go·json
你驴我2 小时前
WhatsApp 消息撤回与编辑的幂等性设计实践
java·服务器·前端·后端·python
一缕清烟在人间2 小时前
HarmonyOS开发实战:小分享-TextEditPage文字编辑器——Header+TextArea+工具栏
后端·华为·harmonyos·鸿蒙
人间凡尔赛2 小时前
K8s 十年之变:从 Cloud Native 到 AI Native,2026 年后端架构的范式革命
后端·云原生·架构
程序员cxuan3 小时前
Opus 5 深夜炸场,价格还挺香。。。
人工智能·后端·程序员
北冥you鱼3 小时前
Go 语言新手扫盲:指针 * 和 & 使用场景详解
开发语言·后端·golang
青山木3 小时前
Hot 100 ---腐烂的橘子
java·数据结构·后端·算法·leetcode·广度优先
卷无止境3 小时前
Python的collections模块:那些被低估的"瑞士军刀"
后端·python