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

📄 fsmain.c

📁 深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心
💻 C
📖 第 1 页 / 共 4 页
字号:

// **************************************************
// 声明: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 + -