⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 disknt.cpp

📁 WIN32高级程序设计书附源码
💻 CPP
字号:
#include <afxwin.h>
#define BLOCKSIZE 4096
char drive[15];
char fillchar = 'm';
int filesize;
UINT blocksize = BLOCKSIZE;
char buffer[BLOCKSIZE];
char dummy[BLOCKSIZE];
HANDLE fh=NULL;
char filename[MAX_PATH];
int file_error=0;

void OkMsgBox (char *szCaption, char *szFormat,...)
	  {
	  char szBuffer [256] ;
	  char *pArguments ;

	  pArguments = (char *) &szFormat + sizeof (szFormat) ;
	  vsprintf (szBuffer, szFormat, pArguments) ;
	  MessageBox (GetActiveWindow(), szBuffer, szCaption, MB_OK) ;
	  }


void diskio0(void)	//create file
{
DWORD SectorsPerCluster;
DWORD BytesPerSector;
DWORD FreeClusters;
DWORD Clusters;
char root[15];

	file_error=0;
	SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX);	
//	OkMsgBox("DEBUG","drive passed is <%s>",drive);
	strcpy(root,drive);
	strcat(root,"\\");
	BOOL bOK=GetDiskFreeSpace(root, &SectorsPerCluster, &BytesPerSector,
		&FreeClusters, &Clusters);
	if(!bOK) {
		MessageBeep(0);
		OkMsgBox("DISKIO0","Could not access Drive %s",root);
		file_error=12;
		return;
	}
	if(FreeClusters*SectorsPerCluster*BytesPerSector<blocksize*filesize) {
		MessageBeep(0);
		OkMsgBox("DISKIO0","Insufficient Space on Drive %s",drive);
		file_error=10;
		return;
		}
	UINT num=GetTempFileName(drive,"mhtest",0,filename);
	if(num==0) {
		MessageBeep(0);
		DWORD error=GetLastError();
		TRACE("DISKIO0: attempt to create temporary file %s, ERROR %d\n",filename,error);
		OkMsgBox("DISKIO0","Could not create temporary file %s, error %d",filename,error);
		file_error=1;
		return;
		}
	TRACE("DISKIO0: drive %s,filename %s\n",drive,filename);
	ASSERT(num>0);
	ASSERT(strlen(filename)>4);
	fh=CreateFile(filename,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,
		FILE_ATTRIBUTE_NORMAL,NULL);
	//NOTE: the CreateFile call above uses OPEN_EXISTING rather than CREATE_NEW
	// because GetTempFileName actually creates the empty file
	// Using CREATE_NEW generates an invalid handle value with ERROR_FILE_EXISTS (80)
	ASSERT(fh);
	if(fh==INVALID_HANDLE_VALUE) {
		MessageBeep(0);
		DWORD error=GetLastError();
		TRACE("DISKIO0: attempt to open file %s, ERROR %d\n",filename,error);
		OkMsgBox("DISKIO0","Could not open file %s, error %d",filename,error);
		file_error=2;
		}
	else
	TRACE("DISKIO0: opened file %s,to write %d of %d\n",filename,filesize,blocksize);
}

void diskio1(void)	//sequential write test
{
	int i;
	BOOL flag=TRUE;
	DWORD written;

   if(file_error) return;
	SetFilePointer(fh,0,0,FILE_BEGIN);
	for(i=0;i<filesize && flag;i++) {
		flag=WriteFile(fh,buffer,blocksize,&written,NULL);
		}
	if(!flag) {
		MessageBeep(0);
		DWORD error=GetLastError();
		TRACE("DISKIO1: could not write block %d, error %d\n",i,error);
		OkMsgBox("Sequential Write Test","Could not write block %d, error %d",i,error);
		file_error=3;
		}
	else {
		TRACE("DISKIO1: wrote %d blocks normally, blocksize %d\n",i,blocksize);
		}
}

void diskio2(void)	//sequential read test
{
	int i;
	BOOL flag=TRUE;
	DWORD read;

   if(file_error) return;
	SetFilePointer(fh,0,0,FILE_BEGIN);
	for(i=0;i<filesize && flag;i++) {
		flag=ReadFile(fh,buffer,blocksize,&read,NULL);
	}
	if(!flag) {
		MessageBeep(0);
		TRACE("DISKIO2: could not read block %d\n",i);
		OkMsgBox("Sequential Read Test","Could not read block %d",i);
		file_error=5;
		}
}

void diskio3(void)	//random write test
{
	int i;
	BOOL flag=TRUE;
	DWORD written;
	long fp1=0L,fp2=0L;

   if(file_error) return;
	for(i=0;i<filesize && flag;i++) {
		fp1=long(rand()*float(filesize-1)/RAND_MAX*blocksize);
		//TRACE("DISKIO3: block %ld\n", fp1);
		SetFilePointer(fh,fp1,&fp2,FILE_BEGIN);
		flag=WriteFile(fh,buffer,blocksize,&written,NULL);
	}
	if(!flag) {
		MessageBeep(0);
		TRACE("DISKIO3: could not write %dth block(offset %ld)\n",i,fp1);
		OkMsgBox("Random Write Test","Could not write %dth block(offset %ld)",i,fp1);
		file_error=7;
	}

}

void diskio4(void)	//random read test
{
	int i;
	BOOL flag=TRUE;
	DWORD read;
	long fp1=0L,fp2=0L;

   if(file_error) return;
	for(i=0;i<filesize && flag;i++) {
		fp1=long(rand()*float(filesize-1)/RAND_MAX*blocksize);
		//TRACE("DISKIO4: block %ld\n", fp1);
		SetFilePointer(fh,fp1,&fp2,FILE_BEGIN);
		flag=ReadFile(fh,buffer,blocksize,&read,NULL);
	}
	if(!flag) {
		MessageBeep(0);
		TRACE("DISKIO4: could not read %dth block(offset %ld)\n",i,fp1);
		OkMsgBox("Random Read Test","Could not read %dth block(offset %ld)",i,fp1);
		file_error=9;
		}

}

void diskio5(void)	//close and delete file
{
	CloseHandle(fh);
	DeleteFile(filename);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -