📄 fsmain.c
字号:
// **************************************************
// 声明:BOOL WINAPI FileSys_RemoveDirectory(
// LPCTSTR lpszPathName )
// 参数:
// IN lpszPathName - 文件夹名
// 返回值:
// 假如成功,返回TRUE; 否则,返回FALSE
// 功能描述:
// 删除文件夹
// 引用:
// 内部使用
// **************************************************
BOOL WINAPI FileSys_RemoveDirectory( LPCTSTR lpcszPathName )
{
int type;
UINT uLen;
BOOL bRetv = FALSE;
if( CheckFilePathName( lpcszPathName ) ) // 检查文件名合法性
{
type = _GetObjName( lpcszPathName, &uLen ); // 得到文件对象类型
if( type == 2 )
{ // 文件对象 file
_LPVOLUME lpVol = _GetVolumePtr( lpcszPathName, &uLen );
if( Sys_CaptureException() == EXCEPTION_NO_ERROR )
{
if( lpVol && lpVol->lpdsk->lpfsd->lpGetFileAttributes )
{
DWORD dwAttrib = lpVol->lpdsk->lpfsd->lpGetFileAttributes( lpVol->pVol, lpcszPathName + uLen );
if( dwAttrib != -1 ) //
{ // 有效的属性
if( !(dwAttrib & FILE_ATTRIBUTE_DEVICE) )
{ // 不是设备文件夹
if( lpVol->lpdsk->lpfsd->lpRemoveDirectory )
bRetv = lpVol->lpdsk->lpfsd->lpRemoveDirectory( lpVol->pVol, lpcszPathName + uLen );
}
}
}
Sys_ReleaseException();
}
}
}
return bRetv;
}
// **************************************************
// 声明:BOOL WINAPI FileSys_SetEnd( HANDLE hFile )
// 参数:
// IN hFile - 文件对象
// 返回值:
// 成功:返回TRUE
// 否则:返回FALSE
// 功能描述:
// 设置文件结束位置
// 引用:
// 系统API
// **************************************************
BOOL WINAPI FileSys_SetEnd( HANDLE hFile )
{
_LPFILEDATA lpFile = _GetHFILEPtr( hFile );
BOOL bRetv = FALSE;
if( lpFile )
{
if( lpFile->hVol )
{ // 文件对象 file
_LPVOLUME lpVol = (_LPVOLUME)lpFile->hVol;
if( Sys_CaptureException() == EXCEPTION_NO_ERROR )
{
if( lpVol->lpdsk->lpfsd->lpSetEndOfFile )
bRetv = lpVol->lpdsk->lpfsd->lpSetEndOfFile( lpFile->pFile );
Sys_ReleaseException();
}
}
}
return bRetv;
}
// **************************************************
// 声明:BOOL WINAPI KL_SetFileAttributes( LPCTSTR lpcszFileName, DWORD dwFileAttributes )
// 参数:
// IN lpcszFileName-文件名
// IN dwFileAttributes-文件属性,包含:
// FILE_ATTRIBUTE_ARCHIVE-文档文件
// FILE_ATTRIBUTE_HIDDEN-隐藏文件
// FILE_ATTRIBUTE_READONLY-只读文件
// FILE_ATTRIBUTE_SYSTEM-系统文件
// 返回值:
// 成功:返回TRUE
// 否则:返回FALSE
// 功能描述:
// 设置文件属性
// 引用:
// 内部使用
// **************************************************
BOOL WINAPI KL_SetFileAttributes( LPCTSTR lpcszFileName, DWORD dwFileAttributes )
{
int type;
UINT uLen;
BOOL bRetv = FALSE;
if( CheckFilePathName( lpcszFileName ) ) // 检查文件名的合法性
{
type = _GetObjName( lpcszFileName, &uLen ); // 得到文件类型
if( type == 2 )
{ // 文件类型 file
_LPVOLUME lpVol = _GetVolumePtr( lpcszFileName, &uLen ); // 得到文件的卷对象
if( Sys_CaptureException() == EXCEPTION_NO_ERROR )
{
if( lpVol && lpVol->lpdsk->lpfsd->lpSetFileAttributes )
{
bRetv = lpVol->lpdsk->lpfsd->lpSetFileAttributes( lpVol->pVol, lpcszFileName + uLen, dwFileAttributes );
}
Sys_ReleaseException();
}
}
}
return bRetv;
}
// **************************************************
// 声明:BOOL WINAPI FileSys_SetAttributes( LPCTSTR lpcszFileName, DWORD dwFileAttributes )
// 参数:
// IN lpcszFileName-文件名
// IN dwFileAttributes-文件属性,包含:
// FILE_ATTRIBUTE_ARCHIVE-文档文件
// FILE_ATTRIBUTE_HIDDEN-隐藏文件
// FILE_ATTRIBUTE_READONLY-只读文件
// FILE_ATTRIBUTE_SYSTEM-系统文件
// 返回值:
// 成功:返回TRUE
// 否则:返回FALSE
// 功能描述:
// 设置文件属性
// 引用:
// 系统API
// **************************************************
BOOL WINAPI FileSys_SetAttributes( LPCTSTR lpcszFileName, DWORD dwFileAttributes )
{
dwFileAttributes &= ~SPECIAL_ATTRIB;
return KL_SetFileAttributes( lpcszFileName, dwFileAttributes );
}
// **************************************************
// 声明:DWORD WINAPI FileSys_SetPointer(
// HANDLE hFile,
// LONG lDistanceToMove,
// LPLONG lpDistanceToMoveHigh,
// DWORD dwMoveMethod )
// 参数:
// IN hFile - 文件对象
// IN lDistanceToMove-相对偏移值(低32bits)
// IN lpDistanceToMoveHigh-(高32bits,不支持,为NULL)
// IN dwMoveMethod-偏移的起始位置,包含:
// FILE_BEGIN-文件开始位置
// FILE_CURRENT-文件当前位置
// FILE_END-文件结束位置
//
// 返回值:
// 成功:返回新的文件位置
// 否则:返回0xffffffff
// 功能描述:
// 设置文件当前存取位置
// 引用:
// 系统API
// **************************************************
DWORD WINAPI FileSys_SetPointer( HANDLE hFile,
LONG lDistanceToMove,
LPLONG lpDistanceToMoveHigh,
DWORD dwMoveMethod)
{
_LPFILEDATA lpFile = _GetHFILEPtr( hFile );
DWORD dwRetv = INVALID_SET_FILE_POINTER;
if( lpFile )
{
if( lpFile->hVol )
{ // 文件对象 file
_LPVOLUME lpVol = (_LPVOLUME)lpFile->hVol;
if( Sys_CaptureException() == EXCEPTION_NO_ERROR )
{
if( lpVol->lpdsk->lpfsd->lpSetFilePointer )
dwRetv = lpVol->lpdsk->lpfsd->lpSetFilePointer( lpFile->pFile, lDistanceToMove, lpDistanceToMoveHigh, dwMoveMethod );
Sys_ReleaseException();
}
}
else
{ // 设备对象 device
return Dev_SetFilePointer( (HANDLE)lpFile->pFile, lDistanceToMove, lpDistanceToMoveHigh, dwMoveMethod );
}
}
return dwRetv;
}
// **************************************************
// 声明:BOOL WINAPI FileSys_SetTime(
// HANDLE hFile,
// const FILETIME *pCreate,
// const FILETIME *pLastAccess,
// const FILETIME *pLastWrite )
// 参数:
// IN hFile - 文件句柄
// IN pCreate-FILETIME结构指针,文件创建时间
// IN pLastAccess-FILETIME结构指针,文件存取时间(目前不支持,为NULL)
// IN pLastWrite-FILETIME结构指针,文件更新时间(目前不支持,为NULL)
// 返回值:
// 成功:返回TRUE
// 否则:返回FALSE
// 功能描述:
// 设置文件时间
// 引用:
// 系统API
// **************************************************
BOOL WINAPI FileSys_SetTime( HANDLE hFile, const FILETIME * pCreate, const FILETIME * pLastAccess, const FILETIME * pLastWrite )
{
_LPFILEDATA lpFile = _GetHFILEPtr( hFile );
BOOL bRetv = FALSE;
if( lpFile )
{
if( lpFile->hVol )
{ // file
_LPVOLUME lpVol = (_LPVOLUME)lpFile->hVol;
if( Sys_CaptureException() == EXCEPTION_NO_ERROR )
{
if( lpVol->lpdsk->lpfsd->lpSetFileTime )
bRetv = lpVol->lpdsk->lpfsd->lpSetFileTime( lpFile->pFile, pCreate, pLastAccess, pLastWrite );
Sys_ReleaseException();
}
}
}
return bRetv;
}
// **************************************************
// 声明:BOOL WINAPI FileSys_Write(
// HANDLE hFile,
// LPCVOID lpvBuffer,
// DWORD dwNumToWrite,
// LPDWORD lpdwNumWrite,
// LPOVERLAPPED pOverlapped)
// 参数:
// IN hFile-文件对象
// IN lpvBuffer-欲写的数据的存放内存
// IN dwNumToWrite-欲写的字节数
// OUT lpdwNumWrite-返回实际写的字节数;假如lpdwNumWrite为NULL,则不返回
// IN pOverlapped-覆盖(不支持,为NULL)
// 返回值:
// 成功:返回TRUE
// 否则:返回FALSE
// 功能描述:
// 写数据到文件
// 引用:
// 系统API
// **************************************************
BOOL WINAPI FileSys_Write( HANDLE hFile,
LPCVOID lpvBuffer,
DWORD dwNumToWrite,
LPDWORD lpdwNumWrite,
LPOVERLAPPED pOverlapped )
{
_LPFILEDATA lpFile = _GetHFILEPtr( hFile );
BOOL bRetv = FALSE;
if( lpFile && lpvBuffer )
{
if( lpFile->hVol )
{ // 文件对象 file
_LPVOLUME lpVol = (_LPVOLUME)lpFile->hVol;
if( Sys_CaptureException() == EXCEPTION_NO_ERROR )
{
if( lpVol->lpdsk->lpfsd->lpWriteFile )
bRetv = lpVol->lpdsk->lpfsd->lpWriteFile( lpFile->pFile, lpvBuffer, dwNumToWrite, lpdwNumWrite, pOverlapped );
Sys_ReleaseException();
}
}
else
{ // 设备对象 device
return Dev_WriteFile( (HANDLE)lpFile->pFile, lpvBuffer, dwNumToWrite, lpdwNumWrite, pOverlapped );
}
}
return bRetv;
}
// **************************************************
// 声明:BOOL WINAPI FileSys_WriteWithSeek(
// HANDLE hFile,
// LPCVOID lpcvBuffer,
// DWORD dwWrite,
// LPDWORD lpdwWritten,
// DWORD dwLowOffset,
// DWORD dwHighOffset )
// 参数:
// IN hFile-文件对象
// OUT lpcvBuffer-写入数据的内存
// IN dwWrite-欲写的字节数
// OUT lpdwWritten-返回实际写的字节数;假如 lpdwWritten 为NULL,则不返回
// IN dwLowOffset - 偏移值的低32位
// IN dwHighOffset - 偏移值的高32位
// 返回值:
// 成功:返回TRUE
// 否则:返回FALSE
// 功能描述:
// 将文件存取位置设到由dwLowOffset dwHighOffset确定的值,然后写数据到文件
// 引用:
// 系统API
// **************************************************
BOOL WINAPI FileSys_WriteWithSeek( HANDLE hFile,
LPCVOID lpcvBuffer,
DWORD dwWrite,
LPDWORD lpdwWritten,
DWORD dwLowOffset,
DWORD dwHighOffset )
{
_LPFILEDATA lpFile = _GetHFILEPtr( hFile );
BOOL bRetv = FALSE;
if( lpFile && lpcvBuffer )
{
if( lpFile->hVol )
{ // file
_LPVOLUME lpVol = (_LPVOLUME)lpFile->hVol;
if( Sys_CaptureException() == EXCEPTION_NO_ERROR )
{
if( lpVol->lpdsk->lpfsd->lpWriteFileWithSeek )
bRetv = lpVol->lpdsk->lpfsd->lpWriteFileWithSeek( lpFile->pFile, lpcvBuffer, dwWrite, lpdwWritten, dwLowOffset, dwHighOffset );
Sys_ReleaseException();
}
}
}
return bRetv;
}
// **************************************************
// 声明:BOOL WINAPI FileSys_Copy(
// LPCTSTR lpcszExistingFileName,
// LPCTSTR lpcszNewFileName,
// BOOL bFailIfExists
// )
// 参数:
// IN lpcszExistingFileName – 源文件名(必须存在)
// IN lpcszNewFileName – 目标文件名(可以存在也可以不存在)
// IN bFailIfExists – 假如目标文件存在,是否该函数失败。
// 假如为TRUE并且目标文件已经存在,该函数失败;
// 假如为FALSE并且目标文件已经存在,该函数将清除目标文件的内容并将源文件内容拷贝到目标文件
// 返回值:
// 假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
// 将文件内容从源文件拷贝到目标文件
// 引用:
// 系统API
// **************************************************
BOOL WINAPI FileSys_Copy( LPCTSTR lpcszExistingFileName, LPCTSTR lpcszNewFileName, BOOL bFailIfExists )
{
int typeOld, typeNew;
UINT uOldLen, uNewLen;
BOOL bRetv = FALSE;
_LPVOLUME lpOldVol, lpNewVol;
if( CheckFilePathName( lpcszExistingFileName ) &&
CheckFilePathName( lpcszNewFileName ) ) // 检查文件名的合法性
{
if( Sys_CaptureException() == EXCEPTION_NO_ERROR )
{
typeOld = _GetObjName( lpcszExistingFileName, &uOldLen ); // 得到文件对象类型
typeNew = _GetObjName( lpcszNewFileName, &uNewLen ); // 得到文件对象类型
if( typeOld == 2 && typeNew == 2 )
{ // 都是文件类型 file
// 得到文件对应的磁盘卷
lpOldVol = _GetVolumePtr( lpcszExistingFileName, &uOldLen );
lpNewVol = _GetVolumePtr( lpcszNewFileName, &uNewLen );
if( lpOldVol == lpNewVol )
{ // 相同的磁盘卷
if( lpOldVol->lpdsk->lpfsd->lpCopyFile )
bRetv = lpOldVol->lpdsk->lpfsd->lpCopyFile( lpOldVol->pVol, lpcszExistingFileName + uOldLen, lpcszNewFileName + uNewLen, bFailIfExists );
}
else
{ // 不同的磁盘卷 volume is different
DWORD dwOldAttrib = -1;
if( lpOldVol->lpdsk->lpfsd->lpGetFileAttributes )
dwOldAttrib = lpOldVol->lpdsk->lpfsd->lpGetFileAttributes( lpOldVol->pVol, lpcszExistingFileName + uOldLen );
if( !(dwOldAttrib & FILE_ATTRIBUTE_DIRECTORY) )
{ // 非文件夹,打开文件 is file
_LPFILEDATA hOldFile = _CreateFile( lpcszExistingFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL );
if( hOldFile != INVALID_HANDLE_VALUE )
{ // 打开老文件成功
DWORD dwCreateFlag = bFailIfExists ? CREATE_NEW : CREATE_ALWAYS;
// 创建新文件
_LPFILEDATA hNewFile = _CreateFile( lpcszNewFileName, GENERIC_READ|GENERIC_WRITE, 0, NULL, dwCreateFlag, 0, NULL );
if( hNewFile != INVALID_HANDLE_VALUE )
{ // 创建新文件成功
FILETIME ft;
// 得到老文件时间
FileSys_GetTime( hOldFile, &ft, NULL, NULL );
// 设置新文件时间
bRetv = FileSys_SetTime( hNewFile, &ft, NULL, NULL );
// 拷贝文件
if( bRetv &&
(bRetv = _CopyFile( hNewFile, hOldFile )) == TRUE )
{
;
}
// 关闭新文件
_CloseFile( hNewFile );
if( bRetv == FALSE ) //
{
if( lpNewVol->lpdsk->lpfsd->lpDeleteFile )
lpNewVol->lpdsk->lpfsd->lpDeleteFile( lpNewVol->pVol, lpcszNewFileName + uNewLen );
}
else // 将新文件属性设置为与老文件相同
lpNewVol->lpdsk->lpfsd->lpSetFileAttributes( lpNewVol->pVol, lpcszNewFileName + uNewLen, dwOldAttrib & (~SPECIAL_ATTRIB) );
}
// 关闭老文件
_CloseFile( hOldFile );
}
}
}
}
Sys_ReleaseException();
}
}
return bRetv;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -