C#中怎么获取本地磁盘。我已经实现了把所有的驱动器都获取出来了^但是包括了光驱。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#中怎么获取本地磁盘。我已经实现了把所有的驱动器都获取出来了^但是包括了光驱。相关的知识,希望对你有一定的参考价值。

请问怎么获取是不得到光驱。。。。。

参考技术A 用这种方法获取的话 你可以利用disk的 DriveType属性来判断。具体这个枚举类型是怎么定义的你可以到MSDN上去查。利用下面的代码要先添加System.Management的应用,然后
using System.Management;
SelectQuery selectQuery = new SelectQuery("select * from win32_logicaldisk");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(selectQuery);
foreach (ManagementObject disk in searcher.Get())

if ((uint)disk["DriveType"] == (uint)DriveType.Fixed)

Console.WriteLine(disk["Name"]);



或者更简单的方法
foreach(DriveInfo di in DriveInfo.GetDrives())

if (di.DriveType == DriveType.Fixed)

//这个drive 就是 本地磁盘。。

追问

DriveInfo[] dr = DriveInfo.GetDrives();
foreach (DriveInfo dd in dr)

if (dd.DriveType == DriveType.CDRom) //过滤掉是光驱的 磁盘

return;

else

listBox1.Items.Add(dd);



我已经做出来了

本回答被提问者采纳

获取具有未知文件格式的磁盘和/或驱动器的大小,C# .NET Framework?

【中文标题】获取具有未知文件格式的磁盘和/或驱动器的大小,C# .NET Framework?【英文标题】:Get Size of Disk and/or Drive With Unknown File Format, C# .NET Framework? 【发布时间】:2016-08-30 00:09:51 【问题描述】:

我希望能够以编程方式获取物理磁盘的大小,或作为物理磁盘一部分的逻辑驱动器。

在正常情况下,获取逻辑驱动器大小很容易。但是,对于我正在使用的磁盘,我有意将原始数据写入其中,因此预计它具有未知的驱动器格式

由于 Windows 不知道驱动器格式,Windows 驱动器属性和 .NET Framework 的 DriveInfo 无法告诉我构成此物理磁盘的逻辑驱动器的大小。在 DriveInfo foo 中,格式是指 foo.DriveFormat,foo.IsReady 为 false,而 foo.TotalSize 会触发异常。只需右键单击驱动器并通过 Windows 的属性选项手动获取大小,它显示驱动器大小为 0 字节。

最好使用 C#,使用 .NET Framework 4.0 或更早版本,在 Windows 7 系统上,我如何了解物理磁盘的大小,或组成物理磁盘的逻辑驱动器,如果与它相关联的逻辑驱动器没有已知的文件结构? 具体来说,物理磁盘大小更适合我的目的。

我知道通常有一种使用 Windows 7 的方法,因为我已经看到应用程序可以提供同一磁盘的准确物理磁盘大小。

【问题讨论】:

你见过这个问题吗? ***.com/questions/4008620/getting-disk-size-properly 可能是 IO 控制消息? IOCTL_DISK_GET_LENGTH_INFO / IOCTL_DISK_GET_DRIVE_GEOMETRY @LasseV.Karlsen,我之前发现了这个问题。经过进一步的努力,我发现我没有在 .NET Framework 中正确使用 IOCTL_DISK_GET_LENGTH_INFO(指针和结构的编组使用不正确)。我会相应地更新问题的答案。 【参考方案1】:

解决方案最终相当简单,并且是现有问题 Getting Disk Size Properly 的扩展

在这里发布我的解决方案,因为完整的代码可能会在将来帮助某人: (仅供参考:从http://pinvoke.net 获得并最少修改的 P/Invoke 定义)

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr CreateFile(
    [MarshalAs(UnmanagedType.LPTStr)] string filename,
    [MarshalAs(UnmanagedType.U4)] FileAccess access,
    [MarshalAs(UnmanagedType.U4)] FileShare share,
    IntPtr securityAttributes, // optional SECURITY_ATTRIBUTES struct or IntPtr.Zero
    [MarshalAs(UnmanagedType.U4)] FileMode creationDisposition,
    [MarshalAs(UnmanagedType.U4)] FileAttributes flagsAndAttributes,
    IntPtr templateFile);

[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern bool DeviceIoControl(IntPtr hDevice, uint dwIoControlCode,
    IntPtr lpInBuffer, uint nInBufferSize,
    IntPtr lpOutBuffer, uint nOutBufferSize,
    out uint lpBytesReturned, IntPtr lpOverlapped);

[DllImport("kernel32.dll", SetLastError = true)]
static extern bool CloseHandle(IntPtr hObject);

struct GET_LENGTH_INFORMATION

    public long Length;
;
long GetPhysDiskSize(string physDeviceID)

    uint IOCTL_DISK_GET_LENGTH_INFO = 0x0007405C;
    uint dwBytesReturned;

    //Example, physDeviceID == @"\\.\PHYSICALDRIVE1"
    IntPtr hVolume = CreateFile(physDeviceID, FileAccess.ReadWrite,
        FileShare.None, IntPtr.Zero, FileMode.Open, FileAttributes.Normal, IntPtr.Zero);

    GET_LENGTH_INFORMATION outputInfo = new GET_LENGTH_INFORMATION();
    outputInfo.Length = 0;

    IntPtr outBuff = Marshal.AllocHGlobal(Marshal.SizeOf(outputInfo));

    bool devIOPass = DeviceIoControl(hVolume,
                        IOCTL_DISK_GET_LENGTH_INFO,
                        IntPtr.Zero, 0,
                        outBuff, (uint)Marshal.SizeOf(outputInfo),
                        out dwBytesReturned,
                        IntPtr.Zero);

    CloseHandle(hVolume);

    outputInfo = (GET_LENGTH_INFORMATION)Marshal.PtrToStructure(outBuff, typeof(GET_LENGTH_INFORMATION));

    Marshal.FreeHGlobal(hVolume);
    Marshal.FreeHGlobal(outBuff);

    return outputInfo.Length;

【讨论】:

以上是关于C#中怎么获取本地磁盘。我已经实现了把所有的驱动器都获取出来了^但是包括了光驱。的主要内容,如果未能解决你的问题,请参考以下文章

c#怎么获取程序当前运行路径

C#中图片已经保存于Bitmap中,如何实现将该Bitmap图像保存在本地磁盘

获取具有未知文件格式的磁盘和/或驱动器的大小,C# .NET Framework?

在 C# 中获取当前 CPU、RAM 和磁盘驱动器的使用情况

电脑本地磁盘图标变了,怎么改回来

怎么用javascript获取本地硬盘的目录树,然后在html页面中显示硬盘目录树?