既能在windows中使用也能在Linux中使用的文件操作类库.docx
《既能在windows中使用也能在Linux中使用的文件操作类库.docx》由会员分享,可在线阅读,更多相关《既能在windows中使用也能在Linux中使用的文件操作类库.docx(10页珍藏版)》请在冰豆网上搜索。
既能在windows中使用也能在Linux中使用的文件操作类库
一、作业名称
编写文件操作类库
二、作业要求
要求该文件操作类库既能在windows中使用,也能在Linux中使用。
在该库中需要封装文件操作中最基本的一些文件操作,其中包括linux下面的open/lseek/read/write/close,windows下面的CreateFile/OpenFile/CloseHandle/WriteFile/
SetFilePointer.
三、设计与实现
首先定义基类MyFile,提供文件操作函数的接口。
再通过条件编译判断操作系统,确定了系统以后,从基类下派生出具体的子类并用相应的系统调用函数来实现。
四、测试
1.测试方案:
按照代码实现的功能,我们对文件的操作主要实现创建,打开,读写,关闭。
2.测试代码:
intmain()
{
//将实例化子类的方法名保存在MyFileSystem类的m_FileSystemFunction对象中,key值为MyFileTest
MyFileSystem:
:
SetInstance("MyFileTest",fun);
//生成子类的实例myFile
MyFile*myFile=MyFileSystem:
:
GetInstance("MyFileTest");
myFile->open();
//创建文件
myFile->MyCreateFile("D:
\\FileTest.txt");
//写文件
myFile->MyWriteFile("D:
\\FileTest.txt","testlinuxhomework1filesystem");
//读文件
myFile->MyReadFile("D:
\\FileTest.txt");
deletemyFile;
return0;
}
3.测试结果及截图:
几个封装的函数基本测试成功,可以正确的调用使用。
6、附录
FileTest.cpp:
#include
#include
#include
#include
usingnamespacestd;
//SYSTEM用于标识系统,1表示windows系统,0表示linux系统
#ifdefWIN32
#defineSYSTEM1
#else
#defineSYSTEM0
#endif
classMyFile;
typedefMyFile*(*FileFunction)();
/*
控制类,用于保存实例化子类的方法名、生成子类的实例
*/
classMyFileSystem
{
public:
staticvoidSetInstance(std:
:
stringname,FileFunctioninstanceFunction)
{
m_FileSystemFunctions[name]=instanceFunction;
}
staticMyFile*GetInstance(std:
:
stringname)
{
if(m_FileSystemFunctions.count(name))
{
returnm_FileSystemFunctions[name]();
}
else
{
returnNULL;
}
}
private:
staticstd:
:
map:
string,FileFunction>m_FileSystemFunctions;
};
std:
:
map:
string,FileFunction>MyFileSystem:
:
m_FileSystemFunctions;
/*
文件操作基类,提供文件操作方法的接口*/
classMyFile
{
public:
virtualvoidopen()=0;
virtualvoidMyCreateFile(char*filename)=0;
virtualvoidMyWriteFile(char*filename,char*inText)=0;
virtualvoidMyReadFile(char*filename)=0;
};
//如果系统是windows,包含windows系统文件基本操作的头文件
#ifSYSTEM==1
#include
#include
#include
DWORDTempBuffer[4];
charLength;
classwindows_filesystem:
publicMyFile
{
public:
voidopen()
{
printf("windowsclass\n");
}
//创建文件
voidMyCreateFile(char*filename)
{
HANDLEhFile;
hFile=CreateFile((LPCSTR)filename,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
CloseHandle(hFile);
}
//写文件
voidMyWriteFile(char*filename,char*inText)
{
HANDLEhFile;
DWORDnBytes;
hFile=CreateFile((LPCSTR)filename,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,0,NULL);
if(hFile!
=INVALID_HANDLE_VALUE)
{
WriteFile(hFile,inText,strlen(inText)+1,&nBytes,NULL);
CloseHandle(hFile);
}
}
//读文件
voidMyReadFile(char*filename)
{
HANDLEhFile;
DWORDdwBytesRead;
charbuffer[4096]={0};
hFile=CreateFile((LPCSTR)filename,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
ReadFile(hFile,buffer,4096,&dwBytesRead,NULL);
CloseHandle(hFile);
std:
:
cout<:
endl;
}
//生成该类的实例
staticMyFile*CreateInstance()
{
staticwindows_filesystem*windows0=newwindows_filesystem;
returnwindows0;
}
};
#else
//系统是linux,派生linux下文件操作的子类_
classlinux_filesystem:
publicMyFile
{
public:
voidopen()
{
printf("Linuxclass\n");
}
//创建文件
voidMyCreateFile(char*filename)
{
MyFile*fp=fopen(filename,"w");
}
//读文件
voidMyReadFile(char*filename)
{
printf("LinuxFilereading...\n");
MyFile*stream;
charbuffer[10];
inti;
stream=fopen(filename,"r");
fread(buffer,sizeof(char),5,stream);
fclose(stream);
for(i=0;i<5;i++)
{
printf("%c",buffer[i]);
}
printf("\n");
}
//写文件
voidMyWriteFile(char*filename,char*buffer)
{
printf("LinuxFilewriting...\n");
MyFile*stream;
inti;
stream=fopen(filename,"w");
fwrite(buffer,sizeof(char),5,stream);
fclose(stream);
for(i=0;i<5;i++)
{
printf("%c",buffer[i]);
}
printf("\n");
}
//打开文件
voidopen(constchar*filename,constchar*mode)
{
MyFile*fp;
fp=fopen(filename,mode);
if(fp==NULL)
{
return;
}
fclose(fp);
}
//生成该类的实例
staticMyFile*CreateInstance()
{
staticlinux_filesystem*linux0=newlinux_filesystem;
returnlinux0;
}
};
#endif
/*
将实例化子类的方法名保存在全局变量fun中*/
#ifSYSTEM==1
FileFunctionfun=&windows_filesystem:
:
CreateInstance;
#else
FileFunctionfun=&linux_filesystem:
:
CreateInstance;
#endif
intmain()
{
//将实例化子类的方法名保存在MyFileSystem类的m_FileSystemFunction对象中,key值为MyFileTest
MyFileSystem:
:
SetInstance("MyFileTest",fun);
//生成子类的实例myFile
MyFile*myFile=MyFileSystem:
:
GetInstance("MyFileTest");
myFile->open();
myFile->MyCreateFile("D:
\\FileTest.txt");
myFile->MyWriteFile("D:
\\FileTest.txt","testlinuxhomework1filesystem");
myFile->MyReadFile("D:
\\FileTest.txt");
deletemyFile;
return0;
}