📄 fsmain.c
字号:
{
if( lpVol->lpdsk->lpfsd->lpFlushFileBuffers )
bRetv = lpVol->lpdsk->lpfsd->lpFlushFileBuffers( lpFile->pFile );
Sys_ReleaseException();
}
}
}
return bRetv;
}
// **************************************************
// 声明:BOOL FileSys_GetDiskFreeSpaceEx(
// LPCTSTR lpszPathName,
// LPDWORD lpdwFreeBytesAvailableToCaller,
// LPDWORD lpdwTotalNumberOfBytes,
// LPDWORD lpdwTotalNumberOfFreeBytes
// )
// 参数:
// IN lpszPathName - 文件名
// OUT lpdwFreeBytesAvailableToCaller - 呼叫者进程空闲的磁盘字节数
// OUT lpdwTotalNumberOfBytes - 总的磁盘字节数
// OUT lpdwTotalNumberOfFreeBytes - 总的空闲磁盘字节数
// 返回值:
// 假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
// 得到当前卷的磁盘使用情况
// 引用:
// 系统API
// **************************************************
BOOL WINAPI FileSys_GetDiskFreeSpaceEx(
LPCTSTR lpcszPathName,
LPDWORD lpdwFreeBytesAvailableToCaller,
LPDWORD lpdwTotalNumberOfBytes,
LPDWORD lpdwTotalNumberOfFreeBytes )
{
int type;
UINT uLen;
BOOL bRetv = FALSE;
if( CheckFilePathName( lpcszPathName ) )// LN 2003-05-23, ADD
{
type = _GetObjName( lpcszPathName, &uLen );
if( type == 2 )
{ // 文件对象 file
DWORD dwSectorsPerCluster;
DWORD dwBytesPerSector;
DWORD dwFreeClusters;
DWORD dwClusters;
_LPVOLUME lpVol = _GetVolumePtr( lpcszPathName, &uLen ); // 得到该文件对应的卷对象
if( Sys_CaptureException() == EXCEPTION_NO_ERROR )
{
if( lpVol && lpVol->lpdsk->lpfsd->lpGetDiskFreeSpace )
{ //
if( lpVol->lpdsk->lpfsd->lpGetDiskFreeSpace( lpVol->pVol, lpcszPathName + uLen, &dwSectorsPerCluster, &dwBytesPerSector, &dwFreeClusters, &dwClusters ) )
{
*lpdwTotalNumberOfBytes = dwSectorsPerCluster * dwClusters * dwBytesPerSector;
*lpdwTotalNumberOfFreeBytes = *lpdwFreeBytesAvailableToCaller = dwSectorsPerCluster * dwFreeClusters * dwBytesPerSector;
bRetv = TRUE;
}
}
Sys_ReleaseException();
}
}
}
return bRetv;
}
// **************************************************
// 声明:DWORD WINAPI FileSys_GetAttributes( LPCTSTR lpcszFileName )
// 参数:
// IN lpszFileName - 文件名
// 返回值:
// 假如成功,返回文件属性;失败,返回0xffffffff
// 功能描述:
// 得到文件属性
// 引用:
// 系统API
// **************************************************
DWORD WINAPI FileSys_GetAttributes( LPCTSTR lpcszFileName )
{
UINT uLen;
DWORD dwRetv = -1;
if( CheckFilePathName( lpcszFileName ) ) //检查文件名
{
if( _GetObjName( lpcszFileName, &uLen ) == 2 ) // 得到文件类型
{ // 文件类型 file
_LPVOLUME lpVol = _GetVolumePtr( lpcszFileName, &uLen ); // 得到卷对象指针
if( Sys_CaptureException() == EXCEPTION_NO_ERROR )
{
if( lpVol && lpVol->lpdsk->lpfsd->lpGetFileAttributes )
{
dwRetv = lpVol->lpdsk->lpfsd->lpGetFileAttributes( lpVol->pVol, lpcszFileName + uLen );
}
Sys_ReleaseException();
}
}
}
return dwRetv;
}
// **************************************************
// 声明:BOOL WINAPI FileSys_GetInformation( HANDLE hFile, FILE_INFORMATION * pfi )
// 参数:
// IN hFile - 文件对象
// OUT pfi - FILE_INFORMATION结构指针,用于接受文件信息
// 返回值:
// 假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
// 得到文件信息
// 引用:
// 系统API
// **************************************************
BOOL WINAPI FileSys_GetInformation( HANDLE hFile, FILE_INFORMATION * pfi )
{
_LPFILEDATA lpFile = _GetHFILEPtr( hFile );
BOOL bRetv = FALSE;
if( lpFile && pfi )
{
if( lpFile->hVol )
{ // file
_LPVOLUME lpVol = (_LPVOLUME)lpFile->hVol;
if( Sys_CaptureException() == EXCEPTION_NO_ERROR )
{
if( lpVol->lpdsk->lpfsd->lpGetFileInformationByHandle )
bRetv = lpVol->lpdsk->lpfsd->lpGetFileInformationByHandle( lpFile->pFile, pfi );
Sys_ReleaseException();
}
}
}
return bRetv;
}
// **************************************************
// 声明:DWORD WINAPI FileSys_GetSize( HANDLE hFile, LPDWORD pFileSizeHigh )
// 参数:
// IN hFile-文件对象
// IN pFileSizeHigh - 文件尺寸的高32bits(不支持,为NULL)
// 返回值:
// 成功:返回文件大小
// 否则:返回 INVALID_FILE_SIZE
// 功能描述:
// 得到文件大小
// 引用:
// 系统API
// **************************************************
DWORD WINAPI FileSys_GetSize( HANDLE hFile, LPDWORD pFileSizeHigh )
{
_LPFILEDATA lpFile = _GetHFILEPtr( hFile );
DWORD dwRetv = INVALID_FILE_SIZE;
if( lpFile )
{
if( lpFile->hVol )
{ // 文件类型 file
_LPVOLUME lpVol = (_LPVOLUME)lpFile->hVol;
if( Sys_CaptureException() == EXCEPTION_NO_ERROR )
{
if( lpVol->lpdsk->lpfsd->lpGetFileSize )
dwRetv = lpVol->lpdsk->lpfsd->lpGetFileSize( lpFile->pFile, pFileSizeHigh );
Sys_ReleaseException();
}
}
}
return dwRetv;
}
// **************************************************
// 声明:BOOL WINAPI KFSD_GetFileTime(
// HANDLE hFile,
// FILETIME * pCreate,
// FILETIME * pLastAccess,
// FILETIME * pLastWrite )
// 参数:
// IN pf - 文件对象指针
// OUT pCreate - 指向FILETIME结构的指针,文件创建时间
// OUT pLastAccess - 指向FILETIME结构的指针,文件最后一次存取时间(目前暂不支持,为NULL)
// OUT pLastWrite - 指向FILETIME结构的指针,文件最后一次更新数据的时间(目前暂不支持,为NULL)
// 返回值:
// 成功:返回TRUE
// 否则:返回FALSE
// 功能描述:
// 得到文件时间
// 引用:
// 系统API
// **************************************************
BOOL WINAPI FileSys_GetTime( HANDLE hFile, FILETIME * pCreate, FILETIME * pLastAccess, 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->lpGetFileTime )
bRetv = lpVol->lpdsk->lpfsd->lpGetFileTime( lpFile->pFile, pCreate, pLastAccess, pLastWrite );
Sys_ReleaseException();
}
}
}
return bRetv;
}
// **************************************************
// 声明:BOOL WINAPI FileSys_Move( LPCTSTR lpcszOldFileName, LPCTSTR lpcszNewFileName )
// 参数:
// IN lpszOldFileName - 当前已存在的文件或文件夹
// IN lpcszNewFileName - 新的文件或文件夹名(新的文件或文件夹名不能已存在)
// 返回值:
// 成功:返回 TRUE
// 否则:返回 FALSE
// 功能描述:
// 移动文件或文件夹
// 新的文件与已存在的文件可在不同的卷;新的文件夹与已存在的文件夹必须在相同的卷。
// 引用:
// 系统API
// **************************************************
BOOL WINAPI FileSys_Move( LPCTSTR lpcszOldFileName, LPCTSTR lpcszNewFileName )
{
int typeOld, typeNew;
UINT uOldLen, uNewLen;
BOOL bRetv = FALSE;
_LPVOLUME lpOldVol, lpNewVol;
// 检查文件的合法性
if( CheckFilePathName( lpcszOldFileName ) && CheckFilePathName( lpcszNewFileName ) )
{
typeOld = _GetObjName( lpcszOldFileName, &uOldLen );
typeNew = _GetObjName( lpcszNewFileName, &uNewLen );
if( Sys_CaptureException() == EXCEPTION_NO_ERROR )
{
if( typeOld == 2 && typeNew == 2 )
{ // 文件类型 file
lpOldVol = _GetVolumePtr( lpcszOldFileName, &uOldLen ); // 得到卷对象
lpNewVol = _GetVolumePtr( lpcszNewFileName, &uNewLen ); // 得到卷对象
if( lpOldVol == lpNewVol )
{ // 同样的卷,调用文件系统驱动程序
if( lpOldVol->lpdsk->lpfsd->lpMoveFile )
bRetv = lpOldVol->lpdsk->lpfsd->lpMoveFile( lpOldVol->pVol, lpcszOldFileName + uOldLen, lpcszNewFileName + uNewLen );
}
else if( lpOldVol && lpNewVol )
{ // 不同的卷
DWORD dwOldAttrib = 0xFFFFFFFFL;
// 得到文件属性
if( lpOldVol->lpdsk->lpfsd->lpGetFileAttributes )
dwOldAttrib = lpOldVol->lpdsk->lpfsd->lpGetFileAttributes( lpOldVol->pVol, lpcszOldFileName + uOldLen );
//
if( !(dwOldAttrib & FILE_ATTRIBUTE_DIRECTORY) )
{ // 非文件夹
DWORD dwNewAttrib = 0xFFFFFFFFL;
if( lpNewVol->lpdsk->lpfsd->lpGetFileAttributes )
dwNewAttrib = lpNewVol->lpdsk->lpfsd->lpGetFileAttributes( lpNewVol->pVol, lpcszNewFileName + uNewLen );
if( dwNewAttrib == 0xFFFFFFFFL && GetLastError() == ERROR_FILE_NOT_FOUND )
{ // now copy old file's data to new file
// 打开老文件
_LPFILEDATA hOldFile = _CreateFile( lpcszOldFileName, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL );
if( hOldFile != INVALID_HANDLE_VALUE )
{ // 创建新文件
_LPFILEDATA hNewFile = _CreateFile( lpcszNewFileName, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_NEW, dwOldAttrib & (~SPECIAL_ATTRIB), NULL );
if( hNewFile != INVALID_HANDLE_VALUE )
{ // 拷贝文件内容(从老文件到新文件)
bRetv = _CopyFile( hNewFile, hOldFile );
_CloseFile( hNewFile ); // 关闭新文件
if( bRetv == FALSE )
{ // 拷贝失败,删除之前创建的文件
if( lpNewVol->lpdsk->lpfsd->lpDeleteFile )
lpNewVol->lpdsk->lpfsd->lpDeleteFile( lpNewVol->pVol, lpcszNewFileName + uNewLen );
}
}
_CloseFile( hOldFile ); // 关闭老文件
if( bRetv )
{ // 假如拷贝成功,删除老文件
if( lpOldVol->lpdsk->lpfsd->lpDeleteFile )
lpOldVol->lpdsk->lpfsd->lpDeleteFile( lpOldVol->pVol, lpcszOldFileName + uOldLen );
}
}
}
}
}
}
Sys_ReleaseException();
}
}
return bRetv;
}
// **************************************************
// 声明:BOOL WINAPI FileSys_Read(
// HANDLE hFile,
// LPVOID lpvBuffer,
// DWORD dwNumToRead,
// LPDWORD lpdwNumRead,
// LPOVERLAPPED lpOverlapped )
// 参数:
// IN hFile-文件对象
// OUT lpvBuffer-用于接受数据的内存
// IN dwNumToRead-欲读的字节数
// OUT lpdwNumRead-返回实际读的字节数;假如lpdwNumRead为NULL,则不返回
// IN lpOverlapped-覆盖(不支持,为NULL)
// 返回值:
// 成功:返回TRUE
// 否则:返回FALSE
// 功能描述:
// 从文件读取数据
// 引用:
// **************************************************
#define DEBUG_FileSys_Read 1
BOOL WINAPI FileSys_Read( HANDLE hFile, LPVOID lpvBuffer, DWORD dwNumToRead, LPDWORD lpdwNumRead, LPOVERLAPPED lpOverlapped )
{
_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->lpReadFile )
{
bRetv = lpVol->lpdsk->lpfsd->lpReadFile( lpFile->pFile, lpvBuffer, dwNumToRead, lpdwNumRead, lpOverlapped );
}
Sys_ReleaseException();
}
else
{
DEBUGMSG( DEBUG_FileSys_Read, ( "FileSys_Read get a exception!.\r\n" ) );
}
}
else
{ // 设备对象 device
bRetv = Dev_ReadFile( (HANDLE)lpFile->pFile, lpvBuffer, dwNumToRead, lpdwNumRead, lpOverlapped );
}
}
return bRetv;
}
// **************************************************
// 声明:BOOL WINAPI FileSys_ReadWithSeek(
// HANDLE hFile,
// LPVOID pBuffer,
// DWORD cbRead,
// LPDWORD pcbRead,
// LPOVERLAPPED pOverlapped,
// DWORD dwLowOffset,
// DWORD dwHighOffset)
// 参数:
// IN hFile-文件对象
// OUT pBuffer-用于接受数据的内存
// IN cbRead-欲读的字节数
// OUT pcbRead-返回实际读的字节数;假如lpdwNumRead为NULL,则不返回
// IN pOverlapped-覆盖(不支持,为NULL)
// IN dwLowOffset - 偏移值的低32位
// IN dwHighOffset - 偏移值的高32位
// 返回值:
// 成功:返回TRUE
// 否则:返回FALSE
// 功能描述:
// 将文件存取位置设到由dwLowOffset dwHighOffset确定的值,然后从文件读取数据
// 引用:
// 系统API,不支持
// **************************************************
BOOL WINAPI FileSys_ReadWithSeek( HANDLE hFile, LPVOID pBuffer,DWORD cbRead,LPDWORD pcbRead,LPOVERLAPPED pOverlapped,DWORD dwLowOffset,DWORD dwHighOffset )
{
_LPFILEDATA lpFile = _GetHFILEPtr( hFile );
BOOL bRetv = FALSE;
if( lpFile && pBuffer )
{
if( lpFile->hVol )
{ // file
_LPVOLUME lpVol = (_LPVOLUME)lpFile->hVol;
if( Sys_CaptureException() == EXCEPTION_NO_ERROR )
{
if( lpVol->lpdsk->lpfsd->lpReadFileWithSeek )
bRetv = lpVol->lpdsk->lpfsd->lpReadFileWithSeek( lpFile->pFile, pBuffer, cbRead, pcbRead, pOverlapped, dwLowOffset, dwHighOffset );
Sys_ReleaseException();
}
}
}
return bRetv;
}
//BOOL WINAPI FileSys_RegisterFileSystemFunction)( PVOL pVol, SHELLFILECHANGEFUNC pft );
// **************************************************
// 声明:BOOL WINAPI KL_RemoveDirectory(
// LPCTSTR lpszPathName )
// 参数:
// IN lpszPathName - 文件夹名
// 返回值:
// 假如成功,返回TRUE; 否则,返回FALSE
// 功能描述:
// 删除文件夹
// 引用:
// 内部使用
// **************************************************
BOOL WINAPI KL_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->lpRemoveDirectory )
{
DEBUGMSG(FSMAIN_ZONE, (TEXT("KL_RemoveDirectory=%s,lpVol=0x%x, lpVolName=%s.\r\n"), lpcszPathName, lpVol, lpVol->lpszVolName ) );
bRetv = lpVol->lpdsk->lpfsd->lpRemoveDirectory( lpVol->pVol, lpcszPathName + uLen );
}
Sys_ReleaseException();
}
}
}
return bRetv;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -