如何在 Windows CE 设备上确定空闲 space?
How can I determine free space on a Windows CE device?
我需要确定 Windows CE 设备上有多少空闲 space,以便有条件地确定是否应该继续执行特定操作。
我认为 Ken Blanco 的回答 here (which bears a striking similarity to the example 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 Explorer 中,它根本没有名字。我确定我现在拥有的 ("C:\") 是不正确的...
更新 2
根据 "Windows programmer" here:“如果你是 运行 Windows CE 那么 \ 是根目录 “
那么,我应该使用:
String folderName = "\";
...或者我需要转义它:
String folderName = "\";
...或者...???
Windows CE API 文档解释了如何使用函数:http://msdn.microsoft.com/en-us/library/ms890887.aspx
lpDirectoryName
[in] Pointer to a null-terminated string that specifies a directory on the specified disk. This string can be a Universal Naming Convention (UNC) name.
If lpDirectoryName is NULL, the GetDiskFreeSpaceEx function obtains information about the object store.
Note lpDirectoryName does not have to specify the root directory on a disk. The function accepts any directory on the disk.
Windows CE 不使用驱动器号,而是文件系统是一个统一的树,就像 Linux 一样,可以由实际上不存在的目录组成,或者父目录的子目录可以存在于不同的物理卷上(或者甚至可能根本不存在于传统卷上:CE 支持将 ROM 和 RAM 卷与传统闪存存储合并,所有这些都在同一文件系统树中)。
假设您的设备有多个卷组合成一个树,我们仍然可以假设您的应用程序目录将在一个卷上,并且您感兴趣的是这个卷,在这种情况下,此代码将适合你:
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.
}
我需要确定 Windows CE 设备上有多少空闲 space,以便有条件地确定是否应该继续执行特定操作。
我认为 Ken Blanco 的回答 here (which bears a striking similarity to the example 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 Explorer 中,它根本没有名字。我确定我现在拥有的 ("C:\") 是不正确的...
更新 2
根据 "Windows programmer" here:“如果你是 运行 Windows CE 那么 \ 是根目录 “
那么,我应该使用:
String folderName = "\";
...或者我需要转义它:
String folderName = "\";
...或者...???
Windows CE API 文档解释了如何使用函数:http://msdn.microsoft.com/en-us/library/ms890887.aspx
lpDirectoryName
[in] Pointer to a null-terminated string that specifies a directory on the specified disk. This string can be a Universal Naming Convention (UNC) name.
If lpDirectoryName is NULL, the GetDiskFreeSpaceEx function obtains information about the object store. Note lpDirectoryName does not have to specify the root directory on a disk. The function accepts any directory on the disk.
Windows CE 不使用驱动器号,而是文件系统是一个统一的树,就像 Linux 一样,可以由实际上不存在的目录组成,或者父目录的子目录可以存在于不同的物理卷上(或者甚至可能根本不存在于传统卷上:CE 支持将 ROM 和 RAM 卷与传统闪存存储合并,所有这些都在同一文件系统树中)。
假设您的设备有多个卷组合成一个树,我们仍然可以假设您的应用程序目录将在一个卷上,并且您感兴趣的是这个卷,在这种情况下,此代码将适合你:
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.
}