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指令定义的一个宏常量,它定义了编译器所支持的最长全路径名的长度。