#define _WIN32_WINNT 0x0500
#include <stdio.h>
#include <Windows.h>
#include <Winioctl.h>#define STREAMSIZE 1 * 1024 * 1024void GetAllocatedRange(HANDLE hFile);
int main()
{
HANDLE hFile;
hFile = CreateFile( TEXT("D:\\test.dat"), GENERIC_WRITE | GENERIC_READ, 0,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
if( hFile == INVALID_HANDLE_VALUE )
{
printf( "CreateFile Failed" );
return 0;
}
DWORD dw = 0;
BOOL bOk = DeviceIoControl( hFile, FSCTL_SET_SPARSE, NULL, 0,
NULL, 0, &dw, NULL );
if( !bOk )
{
dw = GetLastError();
printf( "%d", dw );
return 0;
} printf( "before read:\n ");
GetAllocatedRange( hFile );
HANDLE hFileMap =
CreateFileMapping( hFile, NULL, PAGE_READWRITE,
(DWORD)((SIZE_T)STREAMSIZE >> 32), (SIZE_T)STREAMSIZE, NULL );
if( NULL == hFileMap )
{
printf( "FileMap Create Failed" );
return 0;
}
PBYTE pvMap = (PBYTE)MapViewOfFile( hFileMap, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0 );
printf("read at 1000: %d\n", pvMap[1000 * 1024] );
GetAllocatedRange( hFile );
return 1;
}
void GetAllocatedRange(HANDLE hFile)
{ FILE_ALLOCATED_RANGE_BUFFER farb;
farb.FileOffset.QuadPart = 0;
farb.Length.LowPart = GetFileSize( hFile,(PDWORD)&farb.Length.HighPart ); DWORD cb = 100 * sizeof(farb);
FILE_ALLOCATED_RANGE_BUFFER* pfarb = (FILE_ALLOCATED_RANGE_BUFFER*)
HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, cb);
BOOL bOk = DeviceIoControl(hFile, FSCTL_QUERY_ALLOCATED_RANGES,
&farb, sizeof(farb), pfarb, cb, &cb, NULL);
if( bOk )
{
DWORD dwNum = cb / sizeof(*pfarb);
if( dwNum == 0 )
{
printf("no allocated range\n");
}
else if( dwNum > 0 )
{
for( DWORD i = 0; i < dwNum; i++ )
{
printf( "%7.7u, %7.7u\n",
pfarb[i].FileOffset.LowPart, pfarb[i].Length.LowPart );
}
}
else{}
}
HeapFree( GetProcessHeap(), 0, pfarb );
}
运行结果:
before read:
no allocated range
read at 1000: 0
0983040, 0065536
Press any key to continue
上面是看了windows核心编程后写的测试代码,我的问题是:
为什么在刚创建文件时,通过DeviceIoControl(hFile, FSCTL_QUERY_ALLOCATED_RANGES,
&farb, sizeof(farb), pfarb, cb, &cb, NULL)函数得到的结果是可以理解的,没有分配磁盘空间,
但是我通过文件视图访问了文件的一个字节之后,DeviceIoControl(hFile, FSCTL_QUERY_ALLOCATED_RANGES,
&farb, sizeof(farb), pfarb, cb, &cb, NULL)函数怎么就会认为文件有已经分配了磁盘的区域块啊,但是此时查看文件属性,分明是没有分配磁盘空间的啊,请高手解答。
#include <stdio.h>
#include <Windows.h>
#include <Winioctl.h>#define STREAMSIZE 1 * 1024 * 1024void GetAllocatedRange(HANDLE hFile);
int main()
{
HANDLE hFile;
hFile = CreateFile( TEXT("D:\\test.dat"), GENERIC_WRITE | GENERIC_READ, 0,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
if( hFile == INVALID_HANDLE_VALUE )
{
printf( "CreateFile Failed" );
return 0;
}
DWORD dw = 0;
BOOL bOk = DeviceIoControl( hFile, FSCTL_SET_SPARSE, NULL, 0,
NULL, 0, &dw, NULL );
if( !bOk )
{
dw = GetLastError();
printf( "%d", dw );
return 0;
} printf( "before read:\n ");
GetAllocatedRange( hFile );
HANDLE hFileMap =
CreateFileMapping( hFile, NULL, PAGE_READWRITE,
(DWORD)((SIZE_T)STREAMSIZE >> 32), (SIZE_T)STREAMSIZE, NULL );
if( NULL == hFileMap )
{
printf( "FileMap Create Failed" );
return 0;
}
PBYTE pvMap = (PBYTE)MapViewOfFile( hFileMap, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0 );
printf("read at 1000: %d\n", pvMap[1000 * 1024] );
GetAllocatedRange( hFile );
return 1;
}
void GetAllocatedRange(HANDLE hFile)
{ FILE_ALLOCATED_RANGE_BUFFER farb;
farb.FileOffset.QuadPart = 0;
farb.Length.LowPart = GetFileSize( hFile,(PDWORD)&farb.Length.HighPart ); DWORD cb = 100 * sizeof(farb);
FILE_ALLOCATED_RANGE_BUFFER* pfarb = (FILE_ALLOCATED_RANGE_BUFFER*)
HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, cb);
BOOL bOk = DeviceIoControl(hFile, FSCTL_QUERY_ALLOCATED_RANGES,
&farb, sizeof(farb), pfarb, cb, &cb, NULL);
if( bOk )
{
DWORD dwNum = cb / sizeof(*pfarb);
if( dwNum == 0 )
{
printf("no allocated range\n");
}
else if( dwNum > 0 )
{
for( DWORD i = 0; i < dwNum; i++ )
{
printf( "%7.7u, %7.7u\n",
pfarb[i].FileOffset.LowPart, pfarb[i].Length.LowPart );
}
}
else{}
}
HeapFree( GetProcessHeap(), 0, pfarb );
}
运行结果:
before read:
no allocated range
read at 1000: 0
0983040, 0065536
Press any key to continue
上面是看了windows核心编程后写的测试代码,我的问题是:
为什么在刚创建文件时,通过DeviceIoControl(hFile, FSCTL_QUERY_ALLOCATED_RANGES,
&farb, sizeof(farb), pfarb, cb, &cb, NULL)函数得到的结果是可以理解的,没有分配磁盘空间,
但是我通过文件视图访问了文件的一个字节之后,DeviceIoControl(hFile, FSCTL_QUERY_ALLOCATED_RANGES,
&farb, sizeof(farb), pfarb, cb, &cb, NULL)函数怎么就会认为文件有已经分配了磁盘的区域块啊,但是此时查看文件属性,分明是没有分配磁盘空间的啊,请高手解答。
解决方案 »
- 有关CPropertySheet以及CpropertyPage类相关的问题
- 讨论下 怎么读取txt到cedit
- 使用BCGControlBar存在法律责任的问题吗〉?
- 中国人怎么了????
- FT.人怎么这么少?提个问题几百年都没人看,真怀念改版前的日子,若干年了,,,散分,分多无用。
- 各位大侠,短消息发送的源程序?我想要一份。200分奉送!
- 有谁写过类似于word的编辑器吗?
- 求救,很急,谁能提供繁体转简体的算法或者程序之类的东西,对照表也可以
- 如何在VC中读入语音文件
- VC++导入MSWORD.OLB后的一些错误,求大神帮忙看看
- 急求 怎么样导入DLL源代码?
- 刚建的驱动开发群号 望大侠们前往35492195
就是这句代码执行了之后,直接通过pvMap指针访问文件映射的偏移为1000*1024处的字节,但是此时并没有为文件分配磁盘空间的啊
NTFS Sparse Files For Programmers
http://www.flexhex.com/docs/articles/sparse-files.phtml这是某高人(译者:eRay Jiang)的翻译:
译文:NTFS稀疏文件编程提示
http://dev.eus.cn/2007/10/02/ntfs-sparse-files-for-programmers.htm下面有一个开源的复制稀疏文件的程序,希望对楼主能有帮助。另外,您知道C#中 FILE_ALLOCATED_RANGE_BUFFER 结构体怎么声明吗?