?? pmp_fs_api_za.c
字號:
input:
buf [in] 數據的存放地址
unit_size [in] 一個數據單位的長度
unit_count [in] 數據單位的總數
stream [in] 文件句柄的指針
output:
< 0 失敗
>= 0 成功
note:
將內存中的數據寫入到文件中
*/
/************************************************************************/
#ifndef _FOR_A3K_PROG
INT32 QFS_fwrite (INT8 *buf, INT32 unit_size,INT32 unit_count, ZA_FILE * stream)
#else
INT32 ZA_fwrite (INT8 *buf, INT32 unit_size,INT32 unit_count, ZA_FILE * stream)
#endif
{
UINT16 err;
UINT32 BytesWant2Write;
UINT32 BytesWritten;
UINT32 FileHandle;
// 判斷輸入參數是否合法
if ( (NULL == buf) || (NULL == stream)
|| !unit_size || !unit_count )
{
ERROR_REPORT;
return (INT32) QFS_ERR;
}
// 計算需要進行寫入的數據總數
BytesWant2Write = unit_size * unit_count;
// 進行文件句柄的計算
err = get_file_handle(stream, &FileHandle);
if(err){
ERROR_REPORT;
return (INT32) QFS_ERR;
}
// flush cache
mmuFlushDCache();
// 使用內部函數進行數據的寫入動作
err = fsWrite( (UINT32) FileHandle, buf, BytesWant2Write, &BytesWritten);
// 如果發生錯誤,直接返回失敗
if ( err ) {
ERROR_REPORT;
return (INT32) QFS_ERR;
}
// 返回實際寫入的數據的數量
return BytesWritten/unit_size;
}
/************************************************************************/
/* QFS_fclose
input:
stream [in] 已經打開的文件句柄
output:
0 成功,非0 失敗
func:
關閉句柄所代表的文件
note:
*/
/************************************************************************/
#ifndef _FOR_A3K_PROG
INT32 QFS_fclose(ZA_FILE * stream)
#else
INT32 ZA_fclose(ZA_FILE * stream)
#endif
{
UINT16 err;
UINT32 FileHandle;
// 判斷輸入參數是否合法
if (NULL == stream) {
ERROR_REPORT;
return QFS_ERR;
}
// 計算文件句柄
err = get_file_handle(stream, &FileHandle);
if (err) {
ERROR_REPORT;
return QFS_ERR;
}
// 進行文件的關閉動作
err = fsClose( FileHandle );
// 有錯誤發生時,返回負值
if (err){
ERROR_REPORT;
return QFS_ERR;
}
// 返回成功
return QFS_OK;
}
/************************************************************************/
/* QFS_fseek
input:
stream [in] 文件句柄
offset [in] 偏移值
origin [in] 參考點
SEEK_SET // 文件頭
SEEK_CUR // 當前位置
SEEK_END // 文件尾
output:
0成功,其他值 失敗
func:
注意進行指針移動時,不要穿越實際的文件邊界
*/
/************************************************************************/
#ifndef _FOR_A3K_PROG
INT32 QFS_fseek(ZA_FILE *stream, INT32 offset, INT32 origin)
#else
INT32 ZA_fseek(ZA_FILE *stream, INT32 offset, INT32 origin)
#endif
{
UINT16 err;
UINT32 FileHandle;
// 判斷指針是否合法
if (NULL == stream){
ERROR_REPORT;
return QFS_ERR;
}
// 判斷參考點是否正確
if (!((origin == SEEK_END) || (origin == SEEK_SET) || (origin == SEEK_CUR)))
{
ERROR_REPORT;
return QFS_ERR;
}
// 計算文件句柄
err = get_file_handle(stream, &FileHandle);
if (err) {
ERROR_REPORT;
return QFS_ERR;
}
// 進行指針的移動
err = fsSeek( FileHandle, offset, origin);
if( err ){
ERROR_REPORT;
return QFS_ERR;
}
// 返回成功
return QFS_OK;
}
/************************************************************************/
/* QFS_chdir
input:
path [in] 全路徑名字符串指針
output:
0 成功, 其他值 失敗
func:
進行多級目錄的切換動作
切換目錄失敗的話,不會修改初始的工作目錄
note:
modify: taoli_2006.10.13 原函數有問題,fsDirSet會出錯,移植S1000文件系統
*/
/************************************************************************/
#ifndef _FOR_A3K_PROG
INT32 QFS_chdir(const INT8 *path)
#else
INT32 ZA_chdir(const INT8 *path)
#endif
{
/*Start of taoli on 2006-10-13 10:3 1.0*/
#if 0
UINT16 err;
INT8 *path_name;
printf( "chdir path = [%s]\n", path );
// 判斷輸入參數是否合法
if (NULL == path){
ERROR_REPORT;
return QFS_ERR;
}
#ifndef CHANGE_CODE
// 進行路徑名的設置
err = fsDirSet( (UINT8 *)path, 0x00);
#else
// 繼續編碼的轉換
path_name = get_unicode_ptr( path );
printf( "chdir path_name = [%s]\n", path_name );
err = fsDirSet( (UINT8 *)path_name, strlen(path_name));
#endif
return (INT32) err;
#else
INT16 i,offset;
INT32 ret;
INT8 now_path[256];
INT8 porgdir[256];
INT8 ptemp[256];
memset( ptemp, 0, 256 );
ZA_getcwd( ptemp, 256 );
if(!strcmp(path, ptemp)) // 判斷長文件名與當前的目錄名是否一致
{
return 0;
}
memset( porgdir, 0, 256 );
strcpy(porgdir, ptemp); // 將當前工作路徑進行備份
offset = 0x00;
ret = 0; // 初始化為成功
while (path[offset] == '\\') { // 越過前面的'\\', 直接指向實際的字符串
offset ++;
}
for(i=THE_LAST_DIR+1; i!= THE_LAST_DIR; )
{
if( offset && (path[offset] == '\0') )
{
break;
}
i = get_dir_from_str((char *)path+offset, now_path); // 取出一級目錄名
offset += strlen(now_path); // 指向下一級目錄,注意跳過了一個'\\'
while (path[offset] == '\\') { // 越過 '\\'
offset++;
}
if( strlen(now_path) > 255 ) // 檢查字符串是否越界
{
ERROR_REPORT;
ret = -1; // 如果文件名超長,直接退出
break;
}
ret = fsDirSet( now_path, strlen(now_path) ); // 嘗試著進入該級目錄
if(ret) {
ERROR_REPORT;
break; // 切換目錄失敗,直接退出
}
}
if(!ret) // 切換目錄成功,直接返回
{
return ret;
}
else
{
fsDirSet(porgdir, strlen(porgdir)); // 返回 進入時的目錄名
}
return ret;
#endif
/*End of taoli on 2006-10-13 10:3 1.0*/
}
/************************************************************************/
/* QFS_getcwd
input:
buffer [out] 緩沖區指針
buffer_size [in] 該緩沖區的長度
output:
NULL 失敗
buffer OK!
func:
取出當前的工作路徑名(長文件名)
note:
已經調用了編碼轉換函數
*/
/************************************************************************/
#ifndef _FOR_A3K_PROG
INT8 * QFS_getcwd(INT8 * buffer, INT16 buffer_size)
#else
INT8 * ZA_getcwd(INT8 * buffer, INT16 buffer_size)
#endif
{
UINT16 len;
UINT16 err;
UINT8 *pPath;
// 判斷輸入參數是否合法
if ((NULL == buffer) || !buffer_size ){
ERROR_REPORT;
return NULL;
}
// 進行輸入緩沖區的清空動作
memset(buffer, 0x00, buffer_size);
// 使用內部函數進行
err = fsDirGet( &pPath );
if (err) {
ERROR_REPORT;
return NULL;
}
#ifndef CHANGE_CODE
len = strlen(pPath);
if(len > (buffer_size -1)){ // 判斷是否超過輸入緩沖區的長度
len = buffer_size -1;
}
memcpy(buffer, pPath, len); // 進行字符串的復制動作
#else
// 將得到的UTF8編碼轉換為LOCAL 編碼
SPMP_uni2local(pPath, buffer);
len = strlen(buffer);
#endif
// 如果是根目錄,需要在尾巴上添加"\\"
if (buffer[len-1] == ':') {
buffer[len] = '\\';
}
// 返回成功
return buffer;
}
/************************************************************************/
/* QFS_ftell
input:
stream [in] 文件句柄
output:
<0 失敗, >=0 成功
func:
獲取當前文件指針的值
note:
*/
/************************************************************************/
#ifndef _FOR_A3K_PROG
INT32 QFS_ftell(ZA_FILE * stream)
#else
INT32 ZA_ftell(ZA_FILE * stream)
#endif
{
UINT16 err;
UINT32 now_position;
UINT32 FileHandle;
// 判斷參數是否合法
if (NULL == stream) {
ERROR_REPORT;
return (INT32) QFS_ERR;
}
// 計算文件句柄
err = get_file_handle(stream, &FileHandle);
if (err) {
ERROR_REPORT;
return QFS_ERR;
}
// 使用內部函數,進行指針位置的獲取動作
err = fsTell( FileHandle, &now_position);
if ( err ) {
ERROR_REPORT;
return QFS_ERR;
}
// 返回文件指針的位置
return now_position;
}
/************************************************************************/
/* QFS_fgetsize
input:
stream [in]
output:
<0 失敗
>= 0 文件長度
func:
獲文件的長度
*/
/************************************************************************/
#ifndef _FOR_A3K_PROG
INT32 QFS_fgetsize(ZA_FILE * stream)
#else
INT32 ZA_fgetsize(ZA_FILE * stream)
#endif
{
UINT16 err;
UINT32 file_len, FileHandle;
// 計算文件句柄
err = get_file_handle(stream, &FileHandle);
if (err) {
ERROR_REPORT;
return QFS_ERR;
}
// 獲取文件的長度
err = fsSizeGet( FileHandle, &file_len);
// 出錯返回負數
if (err){
ERROR_REPORT;
return (INT32)QFS_ERR;
}
// 返回文件的長度
return file_len;
}
/************************************************************************/
/* QFS_feof
input:
stream [in] 文件句柄
output:
<0 函數出錯
0 沒有到達文件尾
>0 到達文件尾
func:
判斷是否到達文件的末尾
*/
/************************************************************************/
#ifndef _FOR_A3K_PROG
INT32 QFS_feof(ZA_FILE * stream)
#else
INT32 ZA_feof(ZA_FILE * stream)
#endif
{
UINT16 err;
INT32 f_size;
INT32 now_position;
UINT32 FileHandle;
// 判斷輸入參數是否合法
if(NULL == stream) {
ERROR_REPORT;
return QFS_ERR;
}
// 計算文件句柄
err = get_file_handle(stream, &FileHandle);
if (err) {
ERROR_REPORT;
return QFS_ERR;
}
// 獲取文件的長度
err = fsSizeGet( FileHandle, &f_size);
if( err ) {
ERROR_REPORT;
return QFS_ERR;
}
// 使用內部函數,進行指針位置的獲取動作
err = fsTell( FileHandle, &now_position);
if ( err ) {
ERROR_REPORT;
return QFS_ERR;
}
// 判斷是否到達文件尾
if( now_position < f_size) {
return 0;
}
// 到達文件尾
return 1;
}
/************************************************************************/
/* QFS_opendir
input:
pPath [in] UINT8 * 路徑名字符串指針
output:
NULL 失敗, 非NULL值成功
func:
note:
如果是跟目錄,則進行"\\"的添加動作
*/
/************************************************************************/
#ifndef _FOR_A3K_PROG
ZA_DIR * QFS_opendir(const INT8 *pPath)
#else
ZA_DIR * ZA_opendir(const INT8 *pPath)
#endif
{
UINT16 i,err;
UINT8 *pbuf;
UINT8 *pCurrDir;
// 判斷輸入參數是否合法
if (NULL == pPath) {
ERROR_REPORT;
return NULL;
}
// 獲取當前的工作路徑
err = fsDirGet( &pCurrDir );
if (err) {
ERROR_REPORT;
return NULL;
}
//DEBUG_OUTPUT(("CurrDir..... %s\r\n", pCurrDir));
// 獲得當前路徑字符串的長度
i = strlen(pCurrDir);
// 進行內存的申請動作
pbuf = (UINT8 *) MEM_ALLOC( (UINT32)(i+4) );
if (NULL == pbuf) {
ERROR_REPORT;
return NULL;
}
// 將當前工作路徑保存到申請的內存中
strcpy(pbuf, pCurrDir);
if ( !strcmp(pbuf,"C:") || !strcmp(pbuf, "D:") ) {
strcat(pbuf, "\\");
}
#ifndef CHANGE_CODE
// 切換到目標目錄
err = fsDirSet((UINT8 *)pPath, 0x00);
#else
UINT8 *ptemp;
ptemp = get_unicode_ptr( pPath );
err = fsDirSet(ptemp, 0x00);
#endif
// 切換目錄失敗
if (err) {
ERROR_REPORT;
MEM_FREE( pbuf);
return NULL;
}
// 進行第一次的搜索
err = fsFirstFileFind( );
// 尋找失敗
if (err) {
ERROR_REPORT;
MEM_FREE( pbuf);
return NULL;
}
// 返回備份原目錄的內存值
return pbuf;
}
/************************************************************************/
/* QFS_readdir
input:
pdir [in]
buffer [in]
pinfo [out]
output:
< 0 失敗
= 0 成功
> 0 結束
func:
讀取文件夾下的文件名、目錄名
note:
已進行編碼的轉換
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -