3
我想枚舉未裝入直接字母的驅動器,以便我可以獲取每個驅動器上的剩餘空間。此應用程序必須與Windows XP一起使用,因此Win32_Volume類不可用。使用非託管的FindFirstVolume枚舉C#中的.NET的卷#
執行以下代碼時,會引發System.ExecutionEngineException。
using System;
using System.Text;
using System.Runtime.InteropServices;
using System.Collections.Generic;
class Test : IDisposable
{
public static void Main(string[] args)
{
try
{
GetVolumes();
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
//HANDLE WINAPI FindFirstVolume(
// __out LPTSTR lpszVolumeName,
// __in DWORD cchBufferLength
//);
[DllImport("kernel32.dll", EntryPoint = "FindFirstVolume", SetLastError = true, CallingConvention = CallingConvention.StdCall)]
public static extern int FindFirstVolume(
out StringBuilder lpszVolumeName,
int cchBufferLength);
[DllImport("kernel32.dll", EntryPoint = "FindNextVolume", SetLastError = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool FindNextVolume(
int hFindVolume,
out StringBuilder lpszVolumeName,
int cchBufferLength);
public static List<string> GetVolumes()
{
const int N = 1024;
StringBuilder cVolumeName = new StringBuilder((int)N);
List<string> ret = new List<string>();
int volume_handle = FindFirstVolume(out cVolumeName, N);
do
{
ret.Add(cVolumeName.ToString());
Console.WriteLine(cVolumeName.ToString());
} while (FindNextVolume(volume_handle, out cVolumeName, N));
return ret;
}
void IDisposable.Dispose()
{
throw new NotImplementedException();
}
}