CreateFile打开的分区,怎么获取文件的大小啊?

wutaihua 2008-07-18 09:35:35
我用CreateFile打开文件是成功的,但是我获取大小的时候失败了,请大家指教

HANDLE hPartition = CreateFile("\\\\.\\i:", GENERIC_READ,FILE_SHARE_READ,0, OPEN_EXISTING, 0, 0);

DWORD dwLow, dwHigh;
dwLow = GetFileSize(hPartition,&dwHigh);//我用这个打开分区,句柄不是空的,但是返回的值是无效的,请大家指正!对了,分区都是大于2G的
...全文
697 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
xinyuxinlu 2008-07-18
  • 打赏
  • 举报
回复
#include <windows.h>
#include <stdio.h>

typedef BOOL (WINAPI *PGETDISKFREESPACEEX)(LPCSTR, PULARGE_INTEGER, PULARGE_INTEGER, PULARGE_INTEGER);

BOOL MyGetDiskFreeSpaceEx(LPCSTR pszDrive)
{
PGETDISKFREESPACEEX pGetDiskFreeSpaceEx;
__int64 i64FreeBytesToCaller, i64TotalBytes, i64FreeBytes;

DWORD dwSectPerClust, dwBytesPerSect, dwFreeClusters, dwTotalClusters;

BOOL fResult;

pGetDiskFreeSpaceEx = (PGETDISKFREESPACEEX)GetProcAddress(
GetModuleHandle("kernel32.dll"),
"GetDiskFreeSpaceExA");

if (pGetDiskFreeSpaceEx)
{
fResult = pGetDiskFreeSpaceEx (pszDrive,
(PULARGE_INTEGER)&i64FreeBytesToCaller,
(PULARGE_INTEGER)&i64TotalBytes,
(PULARGE_INTEGER)&i64FreeBytes);

// Process GetDiskFreeSpaceEx results.
if (fResult)
{
printf("Free Bytes To Caller = %I64d (%dG)\n", i64FreeBytesToCaller, i64FreeBytesToCaller / 1024 / 1024 / 1024);
printf("Total bytes = %I64d (%dG)\n", i64TotalBytes, i64TotalBytes / 1024 / 1024 / 1024);
printf("Total free bytes = %I64d (%dG)\n", i64FreeBytes, i64FreeBytes / 1024 / 1024 / 1024);
}
return fResult;
}
else
{
fResult = GetDiskFreeSpaceA (pszDrive,
&dwSectPerClust,
&dwBytesPerSect,
&dwFreeClusters,
&dwTotalClusters);

// Process GetDiskFreeSpace results.
if(fResult)
{
printf("Total free bytes = %I64d\n",
dwFreeClusters*dwSectPerClust*dwBytesPerSect);
}
return fResult;
}
}

int main(int argc, char *argv[])
{
MyGetDiskFreeSpaceEx("C:");

return 0;
}
cnzdgs 2008-07-18
  • 打赏
  • 举报
回复
GetFileSize是获取文件大小的,不能获取分区大小。
用DeviceIoControl,GET_LENGTH_INFORMATION或者IOCTL_DISK_GET_PARTITION_INFO来取。
thirddata 2008-07-18
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 wutaihua 的回复:]
引用 8 楼 sunyim 的回复:
引用楼主 wutaihua 的帖子:
我用CreateFile打开文件是成功的,但是我获取大小的时候失败了,请大家指教

C/C++ code
HANDLE hPartition = CreateFile("\\\\.\\i:", GENERIC_READ,FILE_SHARE_READ,0, OPEN_EXISTING, 0, 0);

DWORD dwLow, dwHigh;
dwLow = GetFileSize(hPartition,&dwHigh);//我用这个打开分区,句柄不是空的,但是返回的值是无效的,请大家指正!对了,分区都是大于2…
[/Quote]

GetDiskFreeSpace (strDriver.c_str(),
&dwSectPerClust,
&dwBytesPerSect,
&dwFreeClusters,
&dwTotalClusters);
unsigned __int64 nResult = dwFreeClusters*dwSectPerClust;
wutaihua 2008-07-18
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sunyim 的回复:]
引用楼主 wutaihua 的帖子:
我用CreateFile打开文件是成功的,但是我获取大小的时候失败了,请大家指教

C/C++ code
HANDLE hPartition = CreateFile("\\\\.\\i:", GENERIC_READ,FILE_SHARE_READ,0, OPEN_EXISTING, 0, 0);

DWORD dwLow, dwHigh;
dwLow = GetFileSize(hPartition,&dwHigh);//我用这个打开分区,句柄不是空的,但是返回的值是无效的,请大家指正!对了,分区都是大于2G的


你要获取分区大小?
[/Quote]

对呀,比如我插入个移动硬盘,获取其大小
一条晚起的虫 2008-07-18
  • 打赏
  • 举报
回复
无效号码57: A network adapter hardware error occurred. //晕倒
我执行的结果是错误代码 1, ERROR_INVALID_FUNCTION, 估计不支持这样用
//获取磁盘空间可以用GetDiskFreeSpace()
king820802 2008-07-18
  • 打赏
  • 举报
回复
用DeviceIoControl去和disk交互下得大小吧,这个应该可以得到
sunyim 2008-07-18
  • 打赏
  • 举报
回复
[Quote=引用楼主 wutaihua 的帖子:]
我用CreateFile打开文件是成功的,但是我获取大小的时候失败了,请大家指教

C/C++ code
HANDLE hPartition = CreateFile("\\\\.\\i:", GENERIC_READ,FILE_SHARE_READ,0, OPEN_EXISTING, 0, 0);

DWORD dwLow, dwHigh;
dwLow = GetFileSize(hPartition,&dwHigh);//我用这个打开分区,句柄不是空的,但是返回的值是无效的,请大家指正!对了,分区都是大于2G的
[/Quote]

你要获取分区大小?
king820802 2008-07-18
  • 打赏
  • 举报
回复
估计disk是属于不支持的类型
king820802 2008-07-18
  • 打赏
  • 举报
回复
You cannot use the GetFileSize function with a handle of a nonseeking device such as a pipe or a communications device. To determine the file type for hFile, use the GetFileType function.
wutaihua 2008-07-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 king820802 的回复:]
GetLastError看看为什么是无效的
[/Quote]

-----------------------------------
无效号码是57,但是我觉得这个无效号码是多余的,我用不同的机子试验也是这样的,大家可以用自己的机子试验下,不知道有成功的么?
NIKE霸天虎 2008-07-18
  • 打赏
  • 举报
回复
Returns the size, in bytes, of a specified drive.

Unit

SysUtils

Category

file management routines

Delphi syntax:

function DiskSize(Drive: Byte): Int64;

C++ syntax:

extern PACKAGE __int64 __fastcall DiskSize(Byte Drive);

Description

DiskSize returns the size in bytes of the specified drive, where 0 = Current, 1 = A, 2 = B, etc. DiskSize returns -1 if the drive number is invalid.

Note: DiskSize is only available on Windows.

This example uses a form with a label on it. When the following code executes, it displays a message in the label indicating the number of KB free, and what percentage of the entire disk space that represents.

var

S: string;
AmtFree: Int64;
Total: Int64;
begin
AmtFree := DiskFree(0);
Total := DiskSize(0);
S := IntToStr(AmtFree div Total) + 'percent of the space on drive 0 is free: ' (AmtFree div 1024) + ' Kbytes free. ';
Label1.Caption := S;
end;
king820802 2008-07-18
  • 打赏
  • 举报
回复
GetLastError看看为什么是无效的
wutaihua 2008-07-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sunyim 的回复:]
通过 GetFileSize API 函数获取文件大小;

HANDLE hFile;
DWORD dwFileSize = 0;
char szData[30];

hFile = CreateFile("e:\test1.wav",GENERIC_READ,FILE_SHARE_READ,NULL,
OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

dwFileSize = GetFileSize(hFile,NULL);

CloseHandle(hFile);

sprintf(szData,"File Size : %d",dwFileSize);

MessageBox(NULL,szData,"FileSize",MB_ICONINFORMATION);
[/Quote]

我打开的是一个分区,而非一个文件,比如打开的C盘,文件应该是可以的,但是我要获取的是分区的大小啊
sunyim 2008-07-18
  • 打赏
  • 举报
回复
通过 GetFileSize API 函数获取文件大小;

HANDLE hFile;
DWORD dwFileSize = 0;
char szData[30];

hFile = CreateFile("e:\test1.wav",GENERIC_READ,FILE_SHARE_READ,NULL,
OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

dwFileSize = GetFileSize(hFile,NULL);

CloseHandle(hFile);

sprintf(szData,"File Size : %d",dwFileSize);

MessageBox(NULL,szData,"FileSize",MB_ICONINFORMATION);
wutaihua 2008-07-18
  • 打赏
  • 举报
回复
我自己做出来的标准答案,给以后需要解决这个问题的人做个借鉴


ULONGLONG CSdDiskTestToolDlg::GetDiskSize(CString strDestinationFilePartition)
{
ULARGE_INTEGER FreeBytesAvailableToCaller;
ULARGE_INTEGER TotalNumberOfBytes;
ULARGE_INTEGER TotalNumberOfFreeBytes;

GetDiskFreeSpaceEx(strDestinationFilePartition,
&FreeBytesAvailableToCaller,
&TotalNumberOfBytes,
&TotalNumberOfFreeBytes);
return TotalNumberOfBytes.QuadPart;
}
亲自验证,起码我用的是正确的
wutaihua 2008-07-18
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 thirddata 的回复:]
引用 11 楼 wutaihua 的回复:
引用 8 楼 sunyim 的回复:
引用楼主 wutaihua 的帖子:
我用CreateFile打开文件是成功的,但是我获取大小的时候失败了,请大家指教

C/C++ code
HANDLE hPartition = CreateFile("\\\\.\\i:", GENERIC_READ,FILE_SHARE_READ,0, OPEN_EXISTING, 0, 0);

DWORD dwLow, dwHigh;
dwLow = GetFileSize(hPartition,&dwHigh);//我用这个打开分区,句柄不是空的,但是返回的值是无效的,请…
[/Quote]

你这个是正确答案,其他的答案我还没来得及试验,我自己亲自实践下,凡是正确的,一律补分!
发帖必然结贴~~~~
yc_8301 2008-07-18
  • 打赏
  • 举报
回复
路过。。顶一下。。
grachel 2008-07-18
  • 打赏
  • 举报
回复
用GetFileSize来获取分区大小应该是不对的哦!具体应该怎么获取就看上面几楼提供的方法吧!

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧