想用C#写一个读写稀疏文件的程序,找到一个VC++的开源程序,除了 FILE_ALLOCATED_RANGE_BUFFER 结构体以外,似乎C#都可以实现。翻遍了google也没有找到。哪位前辈知道在C#中怎样声明和使用 FILE_ALLOCATED_RANGE_BUFFER ?开源程序的相关代码如下:
// Range to be examined
FILE_ALLOCATED_RANGE_BUFFER queryrange; // Allocated areas info
FILE_ALLOCATED_RANGE_BUFFER ranges[1024];
// File range to query
queryrange.FileOffset.QuadPart = 0; //(the whole file)稀疏文件的大小
queryrange.Length = iFileSize;
我在MSDN中找到 FILE_ALLOCATED_RANGE_BUFFER 结构体的声明如下:
typedef struct _FILE_ALLOCATED_RANGE_BUFFER
{
LARGE_INTEGER FileOffset;
LARGE_INTEGER Length;
} FILE_ALLOCATED_RANGE_BUFFER, *PFILE_ALLOCATED_RANGE_BUFFER;非常感谢!
// Range to be examined
FILE_ALLOCATED_RANGE_BUFFER queryrange; // Allocated areas info
FILE_ALLOCATED_RANGE_BUFFER ranges[1024];
// File range to query
queryrange.FileOffset.QuadPart = 0; //(the whole file)稀疏文件的大小
queryrange.Length = iFileSize;
我在MSDN中找到 FILE_ALLOCATED_RANGE_BUFFER 结构体的声明如下:
typedef struct _FILE_ALLOCATED_RANGE_BUFFER
{
LARGE_INTEGER FileOffset;
LARGE_INTEGER Length;
} FILE_ALLOCATED_RANGE_BUFFER, *PFILE_ALLOCATED_RANGE_BUFFER;非常感谢!
{
LARGE_INTEGER FileOffset;
LARGE_INTEGER Length;
} struct LARGE_INTEGER
{
int lowpart;
int highpart;
}
public struct FILE_ALLOCATED_RANGE_BUFFER
{
LARGE_INTEGER FileOffset;
LARGE_INTEGER Length;
} public struct LARGE_INTEGER
{
int lowpart;
int highpart;
}把VC++的代码改成:
// Range to be examined
FILE_ALLOCATED_RANGE_BUFFER queryrange; // Allocated areas info
FILE_ALLOCATED_RANGE_BUFFER[] ranges = new FILE_ALLOCATED_RANGE_BUFFER[1024];
// File range to query
queryrange.FileOffset.QuadPart = 0;出现错误:
“FileCopy.FILE_ALLOCATED_RANGE_BUFFER.FileOffset”不可访问,因为它受保护级别限制我查了一下,别人出现这个错误的原因是没有声明成 public ,可我改成 public 还是出错。FILE_ALLOCATED_RANGE_BUFFER 是不是应该是一个至少有“FileOffset”方法和“Length”属性的类?
queryrange.FileOffset.QuadPart 中的 QuadPart 和 LARGE_INTEGER 结构的高位地位没有关系吗?
声明改成了:
public struct FILE_ALLOCATED_RANGE_BUFFER
{
public LARGE_INTEGER FileOffset;
public LARGE_INTEGER Length;
} public struct LARGE_INTEGER
{
public int lowpart;
public int highpart;
}不过,LARGE_INTEGER 是不是还应该有一个“LONGLONG QuadPart”成员吧?
MSDN上的声明是:
typedef union _LARGE_INTEGER {
struct {
DWORD LowPart;
LONG HighPart;
}; struct {
DWORD LowPart;
LONG HighPart;
} u; LONGLONG QuadPart;
} LARGE_INTEGER, *PLARGE_INTEGER;
{
Public Long FileOffset;
Public Long Length;
}
楼上的VC代码是将FileOffset和Length直接使用8字节的类型来使用,所以用Long来代替
//占用字节数:
//DWORD LowPart 为4字节32位。一组的第1个,使用从第1个到第4个字节内存
//LONG HighPart 为4字节32位。一组的第2个,使用从第5个到第8个字节内存
//LONGLONG QuadPart 为8字节64位。另一组,使用从第1个到第8个字节内存
[StructLayout(LayoutKind.Explicit, Size=8)]
struct LARGE_INTEGER
{
[FieldOffset(0)]public Int32 LowPart;
[FieldOffset(4)]public Int32 HighPart;
[FieldOffset(0)]public Int64 QuadPart;
}非常感谢您的帮助!非常感谢!