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;
        }
    }
}
相关推荐
平凡但不平庸的码农3 分钟前
Go 语言基础语法
开发语言·后端·golang
是宇写的啊5 分钟前
SpringBoot 统一功能处理
java·spring boot·后端
等....7 分钟前
Spring Boot多模块项目部署
java·spring boot·后端
20岁30年经验的码农11 分钟前
Spring Boot 配置文件生效规则
spring boot·后端·pycharm
霸道流氓气质44 分钟前
SpringBoot+LangChain4j+Ollama+MCP实现智能天气工具调用示例
java·spring boot·后端
ErizJ1 小时前
Go|腾讯面经总结
开发语言·后端·golang
geovindu1 小时前
go: Registry Pattern
开发语言·后端·设计模式·golang·注册模式
Le_ee1 小时前
ctfweb:flask+ssti
后端·python·flask
木易 士心1 小时前
一文彻底搞懂 Elasticsearch:原理、场景、避坑与优化
大数据·后端·elasticsearch·搜索引擎
IT 行者1 小时前
Spring Boot 4.1.0-RC1 发布:核心新特性解析
java·spring boot·后端