文件操作的主要API函数:
1、打开文件
HANDLE WINAPI CreateFile(
LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
);
参数说明:
lpFIleName:要打开的或者创建的文件名,也可以不是文件名,可以是管道名;
dwDesiredAccess:对文件的访问模式,通常是GENERIC_READ和GENERIC_WRITE;
dwShareMode:对文件的访问模式,windows是一个多进程的操作系统,在一个文件杯访问时,可能有另一个进程也访问文件,这时第一个打开文件的进程就要对其设置一个访问模式,即打开文件后,其他进程可对文件有哪些操作;
lpSecurityAttribute:安全属性,一般为NULL;
dwCreationDisposition:在创建文件时文件存在或者不存在时该函数的处理方式;
dwFlagsAndAttribute:打开或创建文件时的标志和属性,一般是FILE_ATTRIBUTE_NORMAL;
hTemplateFile:文件模板,一般为NULL;
返回值:
若执行成功,返回一个文件句柄;
2、在对文件使用完毕之后,应该对打开的句柄进行关闭以释放资源
BOOL CloseHandle(HANDEL hObject);
3、删除文件
BOOL DeleteFile(LPCTSTR lpFileName); //file name
4、读取文件
BOOL ReadFile(
HANDLE fFile,
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
DWORD nNumberOfBytesRead,
LPOVERLAPPED lpOverLapped);
参数说明:
hFile:CreateFile函数返回的句柄;
lpBuffer:指定一个缓冲区,函数从文件中读取的内容保存在这个缓冲区中;
nNumberOfBytesToRead:要求读入的字节数,通常情况下是缓冲区的大小;
nNumberOfBytesRead:保存实际读入的字节数;
lpOverLapped:一般为NULL;
5、写入文件
BOOL WriteFile(
HANDLE fFile,
LPVOID lpBuffer,
DWORD nNumberOfBytesToWrite,
DWORD nNumberOfBytesReadWrite,
LPOVERLAPPED lpOverLapped);
参数的含义基本相同,其中第二个参数是保存将要写入文件的内容的缓冲区;
6、设置文件指针
DWORD SetFilePointer(
HANDLE hFile,
LONG lDistanceToMove,
PLONG lpDistanceToMoveHigh,
DWORD dwMoveMethod);
参数说明:
hFIle:与上面的一样,表示文件的句柄;
lDistanceToMove:指定要移动的距离;
lpDistanceToMoveHigh:一个指向LONG型的指针,其保存一个要移动距离的高八位;
dwMoveMethod:指定要移动的起始位置;
7、创建目录
BOOL CreateDirectory(
LPCTSTR lpPathName,
LPSECURITY_ATTRIBUTES lpSecurityAttributes);
lpPathName:创建目录的目录名称(包含路径)
lpSecurityAttribute:一般为NULL;
8、移除目录
BOOL CreateDirectory(
LPCTSTR lpPathName)
编写AutoRun的部分代码:
获取盘符,初始化组合框
void CUDlg::InitComboDriver()
{
char szDriverString[MAXBYTE] = {0};
char *pTmp = NULL;
SetDlgItemText(IDC_COMBO1,_T("请选择欲免疫的盘符..."));
GetLogicalDriveStrings(MAXBYTE,szDriverString);
pTmp = szDriverString;
while(*pTmp)
{
m_ComboDriver.AddString(pTmp);
pTmp += 4;
}
}
添加免疫按钮的消息映射函数
#define AUTORUN "autorun.inf"
#define IMMUNITY "\\immunity...\\"
void CUDlg::OnCancel2()
{
// TODO: Add your control notification handler code here
char szPath[MAX_PATH] = {0};
GetDlgItemText(IDC_COMBO1,szPath,MAX_PATH);
strcat(szPath,AUTORUN);
BOOL bRet = CreateDirectory(szPath,NULL);
if(!bRet)
{
AfxMessageBox("无法免疫该盘符!可能已经免疫,或者该盘为不可写状态!");
return;
}
strcat(szPath,IMMUNITY);
bRet = CreateDirectory(szPath,NULL);
if(!bRet)
{
AfxMessageBox("无法免疫该盘符!可能已经免疫,或者该盘为不可写状态!");
return ;
}
}
void CUDlg::OnCancel()
{
// TODO: Add extra cleanup here
char szPath[MAX_PATH] = {0};
GetDlgItemText(IDC_COMBO1,szPath,MAX_PATH);
strcat(szPath,AUTORUN);
strcat(szPath,IMMUNITY);
RemoveDirectory(szPath);
ZeroMemory(szPath,MAX_PATH);
GetDlgItemText(IDC_COMBO1,szPath,MAX_PATH);
strcat(szPath,AUTORUN);
RemoveDirectory(szPath);
CDialog::OnCancel();
}