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

📄 fsmain.c

📁 深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心
💻 C
📖 第 1 页 / 共 4 页
字号:
			{
				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 + -