胡神

导航

[C语言]系统目录操作函数

7个主要函数。TempPath()获取临时文件目录;CurrentPath()获取当前工作目录;SystemPath()获取system32目录;WindowsPath()获取Windows目录;ShortPath()获取短文件名;ExePath()获取exe可执行文件目录;GetDir()获取指定文件的目录路径。

 

#include <stdio.h>
#include <windows.h>

/*将给定的两个字符串连接起来,并返回为一个新的字符串*/
char* StringJoin(const char* first,const char* last)
{
     char* result;
     int len = strlen(first)+strlen(last)+1;
     result = (char*)malloc(len*sizeof(char));
     memset(result,0,len*sizeof(char));
     strcpy(result,first);
     strcat(result,last);
     return result;
}

/*用StringJoin函数,在字符串末尾添加'\',用于目录路径*/
char* add_slash(char* string)
{
     int len = strlen(string);
     /*查看最后一个字符是否为'\'*/
     if(string[len-1] != '\\')
         return StringJoin(string,"\\");
     else
         return string;
}

/*获取指定字符串指定部分*/
char* StringSub(const char* string,int start,int number)
{
     int len = strlen(string);
     char* temp;
     if(start>len)
     {
         printf("Start %d is too big than string length %d!\n",start,len);
         return NULL;
     }
     if(number>(len-start))
     {
         printf("Number is too big!\n");
         number = len - start + 1;
     }
     temp = (char*)malloc(sizeof(char)*(number+1));
     memset(temp,0,(number+1)*sizeof(char));
   
     int i = 0;
     int j = 0;
     while(i != number)
         temp[i++] = string[(start-1)+j++];
     temp[number]='\0';
   
     return temp;
}
/*获取临时目录*/
char* TempPath()
{
     char *Buffer;
     DWORD dwRet;
     /*获取临时目录*/
     /*获取临时目录字符串大小,包含末尾的'\0'*/
     dwRet   = GetTempPath(0,NULL);
     if( dwRet == 0 )
     {
         printf("GetCurrentDirectory failed (%d)\n", GetLastError());
         return NULL;
     }
     /*根据获取的空间,分配内存,并置零*/
     Buffer = (char *)malloc(sizeof(char)*dwRet);
     memset(Buffer,0,dwRet*sizeof(char));
     /*获取临时目录*/
     GetTempPath(dwRet,Buffer);
     return add_slash(Buffer);
}
/*获取当前工作目录*/
char* CurrentPath()
{
     char *Buffer;
     DWORD dwRet;
     /*获取当前目录*/
     /*获取当前目录字符串大小,包含末尾的'\0'*/
     dwRet   = GetCurrentDirectoryA (0,NULL);
     if( dwRet == 0 )
     {
         printf("GetCurrentDirectory failed (%d)\n", GetLastError());
         return NULL;
     }
     /*根据获取的空间,分配内存,并置零*/
     Buffer = (char *)malloc(sizeof(char)*dwRet);
     memset(Buffer,0,dwRet*sizeof(char));
     /*获取临时目录*/
     GetCurrentDirectoryA (dwRet,Buffer);
     return add_slash(Buffer);
}
/*获取系统System32目录*/
char* SystemPath()
{     
     char *Buffer;
     DWORD dwRet;
     /*获取System目录*/
     /*获取System目录字符串大小,包含末尾的'\0'*/
     dwRet   = GetSystemDirectoryA (NULL,0);
     if( dwRet == 0 )
     {
         printf("GetCurrentDirectory failed (%d)\n", GetLastError());
         return NULL;
     }
     /*根据获取的空间,分配内存,并置零*/
     Buffer = (char *)malloc(sizeof(char)*dwRet);
     memset(Buffer,0,dwRet*sizeof(char));
     /*获取临时目录*/
     GetSystemDirectoryA (Buffer,dwRet);
     return add_slash(Buffer);
}
/*获取Windows目录*/
char* WindowsPath()
{
     char *Buffer;
     DWORD dwRet;
     /*获取Windows目录*/
     /*获取Windows目录字符串大小,包含末尾的'\0'*/
     dwRet   = GetWindowsDirectoryA (NULL,0);
     if( dwRet == 0 )
     {
         printf("GetCurrentDirectory failed (%d)\n", GetLastError());
         return NULL;
     }
     /*根据获取的空间,分配内存,并置零*/
     Buffer = (char *)malloc(sizeof(char)*dwRet);
     memset(Buffer,0,dwRet*sizeof(char));
     /*获取临时目录*/
     GetWindowsDirectoryA (Buffer,dwRet);
     return add_slash(Buffer);
}
/*获取一个文件的短文件名*/
char* ShortPath(char* Path)
{
     char *Buffer;
     DWORD dwRet;
     dwRet = GetShortPathNameA(Path,NULL,0);
     if(dwRet == 0)
         return NULL;
     Buffer = (char*)malloc(sizeof(char)*dwRet);
     memset(Buffer,0,dwRet*sizeof(char));
     GetShortPathNameA(Path,Buffer,dwRet);
     return Buffer;
}
/*获取当前运行程序的目录*/
char* ExePath()
{
     char *Buffer;
     /**/
     DWORD size=32;
     DWORD dwRet=32;
     Buffer = (char*)malloc(sizeof(char)*dwRet);
     memset(Buffer,0,dwRet*sizeof(char));
     /*获取Windows目录*/
     /*获取Windows目录字符串大小,包含末尾的'\0'*/
     dwRet = GetModuleFileNameA(NULL,Buffer,dwRet);
     if(dwRet == 0)
         return NULL;
     while (size == dwRet)
     {
         size *= 2;
         Buffer = (char*)realloc(Buffer,sizeof(char)*size);
         memset(Buffer,0,size*sizeof(char));
         dwRet = GetModuleFileNameA(NULL,Buffer,size);
     }
     return Buffer;
}
/*获取一个指定文件的目录*/
char* GetDir(const char* filepath)
{
     char* pos = strrchr(filepath,'\\');
     if(pos == NULL)
         return NULL;
     else
         return StringSub(filepath,1,pos + 1 - filepath);
}

int main()
{   
     printf("%s\n",TempPath());
     printf("%s\n",CurrentPath());
     printf("%s\n",SystemPath());
     printf("%s\n",WindowsPath());
     printf("%s\n",ShortPath("C:\\Program Files\\7-Zip\\readme.txt"));
     printf("%s\n",ExePath());
     printf("%s\n",GetDir("C:\\aaa\\bbb.exe"));
     printf("%s\n",add_slash("C:\\Windows\\"));
     printf("%s\n",add_slash("C:\\Windows"));

     return 0;
}

posted on 2011-05-16 12:07  胡神  阅读(5757)  评论(1编辑  收藏  举报