我需要确定Windows CE设备上有多少可用空间,以有条件地确定是否应继续执行特定操作。
我认为Ken Blanco的答案here(与例子yonder有惊人的相似之处)会起作用,我改编为:
internal static bool EnoughStorageSpace(long spaceNeeded)
{
DriveInfo[] allDrives = DriveInfo.GetDrives();
long freeSpace = 0;
foreach (DriveInfo di in allDrives)
{
if (di.IsReady)
{
freeSpace = di.AvailableFreeSpace;
}
}
return freeSpace >= spaceNeeded;
}
...但 DriveInfo 在我的Windows CE / compact框架项目中不可用。
我正在引用mscorlib,并且正在使用System.IO,但由于DriveInfo在我的编辑器中比堪萨斯城酋长队的球衣更红,我认为它不适合我。
是否有其他方法可以完成同样的事情?
我改编了这个:
[DllImport("coredll.dll", SetLastError = true, CharSet = CharSet.Auto)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetDiskFreeSpaceEx(string lpDirectoryName,
out ulong lpFreeBytesAvailable,
out ulong lpTotalNumberOfBytes,
out ulong lpTotalNumberOfFreeBytes);
public static bool EnoughStorageSpace(ulong freespaceNeeded)
{
String folderName = "C:\\";
ulong freespace = 0;
if (string.IsNullOrEmpty(folderName))
{
throw new ArgumentNullException("folderName");
}
ulong free, dummy1, dummy2;
if (GetDiskFreeSpaceEx(folderName, out free, out dummy1, out dummy2))
{
freespace = free;
}
return freespace >= freespaceNeeded;
}
...来自编译的here,但我不知道" folderName"应该是一个Windows CE设备;在Windows资源管理器中,它根本没有名称。我确定我现在拥有的东西(" C:\")是不对的......
根据" Windows程序员" here:" 如果您正在运行Windows CE,那么\是根目录"
所以,我应该使用:
String folderName = "\";
......或者我是否需要逃避它:
String folderName = "\\";
...或... ???
答案 0 :(得分:2)
Windows CE API文档说明了如何使用该功能:http://msdn.microsoft.com/en-us/library/ms890887.aspx
lpDirectoryName
[in]指向以null结尾的字符串的指针,该字符串指定指定磁盘上的目录。该字符串可以是通用命名约定(UNC)名称。
如果lpDirectoryName为NULL,则GetDiskFreeSpaceEx函数将获取有关对象库的信息。 注意lpDirectoryName不必指定磁盘上的根目录。该函数接受磁盘上的任何目录。
Windows CE不使用驱动器号,而是文件系统是一个统一的树,就像在Linux上一样,可以包含实际不存在的目录,或父目录的子目录可以包含的目录。存在于不同的物理卷上(或者根本不是传统的卷:CE支持将ROM和RAM卷与传统的Flash存储器合并,所有这些都在同一个文件系统树中)。
假设您的设备将多个卷组合到一个树中,我们仍然可以假设您的应用程序的目录将位于单个卷上,并且您感兴趣的是此卷,其中如果这段代码适合你:
String executingFileName = System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase;
String executingDirectory = System.IO.Path.GetDirectoryName( executingFileName );
UInt64 userFreeBytes, totalDiskBytes, totalFreeBytes;
if( GetDiskFreeSpaceEx( executingDirectory, out userFreeBytes, out totalDiskBytes, totalFreeBytes ) {
// `userFreeBytes` is the number of bytes available for your program to write to on the mounted volume that contains your application code.
}