目前在写一个协议,为了可移植性好;一些使用到的底层都重新定义。这样在移植到不同平台时只要修改IO层就可以了。
由于VC不提供opendir/readdir/closedir函数,所以在VC上使用查找文件等操作时会与POSIX不一样,会是软件可移植性性
变差。所以想到使用VC的FindFirstFile、FindNextFile来实现POSIX里的opendir/readdir/closedir函数
还存在一些不完善的地方,不过目前已经够使用了
#include "GNSS_BaseType.h"
#include <stdio.h>
#include <windows.h>
static HANDLE hFind;
DIR *opendir(const char *name)
{
DIR *dir;
WIN32_FIND_DATA FindData;
char namebuf[512];
sprintf(namebuf,"%s\\*.*",name);
hFind=FindFirstFile(namebuf,&FindData );
if (hFind == INVALID_HANDLE_VALUE)
{
//printf ("FindFirstFile failed (%d)\n", GetLastError());
return 0;
}
dir=(DIR *)GNSS_malloc(sizeof(DIR));
if(!dir)
{
GNSS_printf("mallco fail\n");
return 0;
}
memset(dir,0,sizeof(DIR));
dir->fd=0; //模拟返回
return dir;
}
struct dirent *readdir(DIR *d)
{
u16 i;
static struct dirent dirent;
BOOL bf;
WIN32_FIND_DATA FileData;
if(!d)
{
return 0;
}
bf=FindNextFile(hFind,&FileData);
//fail or end
if(!bf)
{
return 0;
}
for(i=0;i<256;i++)
{
dirent.d_name[i]=FileData.cFileName[i];
if(FileData.cFileName[i]=='\0') break;
}
dirent.d_namlen=i;
dirent.d_reclen=FileData.nFileSizeLow;
//check there is file or directory
if(FileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
{
dirent.d_type=2;
}
else
{
dirent.d_type=1;
}
return (&dirent);
}
int closedir(DIR *d)
{
if(!d) return -1;
hFind=0;
GNSS_free(d);
return 0;
}