获取驱动器磁盘的空间状态

本文介绍了从Windows到Linux环境下移植过程中,如何获取磁盘驱动器的空间状态。探讨了Windows的GetDiskFreeSpaceEx函数及其在Linux下的替代方案,并详细解释了CLOCK_MONOTONIC和LARGE_INTEGER等概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Windows 到Linux 下的移植

1.        对于__int64类型,typedef long long int  __int64

2.        _atoi64()函数,可以使用aoll()

3.        windows 下的GetTickCount

函数功能:GetTickCount返回(retrieve)从操作系统启动到现在所经过(elapsed)的毫秒数,它的返回值是DWORD。函数原型:DWORDGetTickCount(void);

linux下 <time.h> clock_gettime

CLOCK_MONOTONIC:从系统启动这一刻起开始计时,不受系统时间被用户改变的影响。

备注:

int clock_gettime(clockid_t clk_id, structtimespect *tp);clockid_t clk_id用于指定计时时钟的类型,对于我们Programmr以下四种比较常用:

CLOCK_REALTIME, a system-wide realtimeclock.这种类型的时钟可以反映wallclock time,用的是绝对时间,当系统的时钟源被改变,或者系统管理员重置了系统时间之后,这种类型的时钟可以得到相应的调整,也就是说,系统时间影响这种类型的timer。

CLOCK_PROCESS_CPUTIME_ID, high-resolutiontimer provided by the CPU for each process.

CLOCK_THREAD_CPUTIME_ID, high-resolutiontimer provided by the CPU for each of the threads.

CLOCK_MONOTONIC:用的是相对时间,他的时间是通过jiffies值来计算的。该时钟不受系统时钟源的影响,只受jiffies值的影响。

建议:CLOCK_MONOTONIC这种时钟更加稳定,不受系统时钟的影响。如果想反映wall clocktime,就使用CLOCK_REALTIME。

 

struct timespect *tp用来存储当前的时间,其结构如下:

structtimespec {
    time_t tv_sec; 		/*seconds */
    longtv_nsec; 		/*nanoseconds */
};


LARGE_INTEGER

winnt.h

表示一个64位有符号整数

typedef union_LARGE_INTEGER {

struct {

DWORD LowPart;        //低32位

LONG HighPart;           //高32位

};

struct {

DWORD LowPart;

LONG HighPart;

} u;

LONGLONG QuadPart;

} LARGE_INTEGER,*PLARGE_INTEGER;

 

注:

LARGE_INTEGER结构实际上是一个联合。如果你的编译器具有内置支持64位整数,使用QuadPart成员中存储的64位整数。否则,使用LowPart和HighPart成员的存储的64位整数。LARGE_INTEGER结构与FILETIME结构在内部完全一致。

 

例如:

uint64_t MainWindow::file_time_2_utc(const FILETIME *ftime)

{

  LARGE_INTEGER li;

 

  li.LowPart=ftime->dwLowDateTime;

  li.HighPart=ftime->dwHighDateTime;

  return li.QuadPart;

}


GetDiskFreeSpaceEx

获取驱动器磁盘的空间状态,函数返回的是个BOOL类型数据

GetDiskFreeSpaceEx函数声明如下:

BOOL GetDiskFreeSpaceEx(

LPCTSTR lpDirectoryName ,              // 指针,指向一个感兴趣的磁盘目录名称字符串 

// 指针,指向一个接收用户可用磁盘空间字节数的变量

PULARGE_INTEGER lpFreeBytesAvailable ,

// 指针,指向一个接收磁盘空间字节数的变量

PULARGE_INTEGER lpTotalNumberOfBytes ,

// 指针,指向一个接收磁盘可用空间字节数的变量

PULARGE_INTEGER lpTotalNumberOfFreeBytes

);

 

如果函数成功,返回值为非零。如果函数失败,返回值为零。为了获得更多错误信息,可调用GetLastError。

备注:此函数获得的值为ULARGE_INTEGER类型。小心不要将其截断为32位。

 

#003 void DiskFree(void)

#004 {

#005        //

#006        ULARGE_INTEGER use;

#007        ULARGE_INTEGER total;

#008        ULARGE_INTEGER free;

#009        //

#010        if (GetDiskFreeSpaceEx(_T("C:"),&use,&total,&free))

#014        {

#015               debug()<<use.QuadPart<<”\n”<<total.QuadPart<<”\n”<<free.QuadPart;

#016        }

#017 }

 

注:_T(“”)宏:tchar.h         作用是让程序支持Unicode编码

 

 

#define __T(x) L ## x                  是通常使用的单字节方式,但这种方式处理象中文这样的双                                                 字节字符不方便,容易出现半个汉字的情况。

 

#define _T(x) __T(x)                   是双字节方式,方便处理双字节字符。

磁盘驱动器

direct.h

1. int _getdrive(void)

返回当前的磁盘驱动器,1代表A盘,2代表B盘,依次类推

 

2. int _chdrive(int drive).int_chdrive( int dri

改变当前的工作驱动器;改变驱动器成功则返回0,否则返回-1

//    _getdrive       _chdrive        _getdcwd

//

#include <stdio.h>

#include <direct.h>

#include <stdlib.h>

#include <ctype.h>

int main( void )

{

int ch, drive, curdrive;

static char path[_MAX_PATH];

// Save current drive.

curdrive = _getdrive();

printf( "Available drives are:\n" );

// If we can switch to the drive, it exists.

for( drive = 1; drive <= 26; drive++ )

{

if( !_chdrive( drive ) )

{

printf( "%c:", drive + 'A' - 1 );

if( _getdcwd( drive, path, _MAX_PATH ) != NULL )

printf( " (Current directory is %s)", path );

putchar( '\n' );

}

}

// Restore original drive.

_chdrive( curdrive );

return 0;

}

 

3. char* _getcwd(char* buffer, int maxlen)

获取当前工作目录,_getcwd()会将当前工作目录的绝对路径复制到参数buffer所指的内存空间中,参数maxlen为buffer的空间大小。成功则返回当前工作目录,失败返回 FALSE。

 

例如:

char path[_MAX_PATH];

_getcwd(path,_MAX_PATH);

printf("当前工作目录:\n%s\n",path);

if( ( _chdir("d:\\visual c++") )== 0 )

{

printf("修改工作路径成功\n");

_getcwd(path,_MAX_PATH);

printf("当前工作目录:\n%s\n",path);

}

else

{

perror("修改工作路径失败");

exit(1);

}

 

注:_MAX_PATH是C语言运行时库中通过#define指令定义的一个宏常量,它定义了编译器所支持的最长全路径名的长度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值