想用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;非常感谢!

解决方案 »

  1.   

            struct FILE_ALLOCATED_RANGE_BUFFER
            {
                LARGE_INTEGER FileOffset;
                LARGE_INTEGER Length; 
            }        struct LARGE_INTEGER
            {
                int lowpart;
                int highpart;
            }
      

  2.   

    还是有一点小问题。我声明成这样:
        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 结构的高位地位没有关系吗?
      

  3.   

    “不可访问”的错误改好了。
    声明改成了:
    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;
      

  4.   

    数据类型LARGEINTEGER既可以是一个作为8字节长的整数,也可以是作为两个4字节长的整数的联合结构,其具体用法根据编译器是否支持64位而定。
      

  5.   

          struct FILE_ALLOCATED_RANGE_BUFFER 
            { 
                Public Long FileOffset; 
                Public Long Length; 
            } 
    楼上的VC代码是将FileOffset和Length直接使用8字节的类型来使用,所以用Long来代替
      

  6.   

    感谢您的帮助,其他的问题我基本搞明白了。关于结构体 LARGE_INTEGER  的声明,我参考了《如何在C#中模拟C++的联合(Union)》老外的论坛 How to declarate LARGE_INTEGER in C#。最终这样声明了:
        //占用字节数:
        //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;
        }非常感谢您的帮助!非常感谢!