C语言中POSIX到DOS和DOS到POSIX的路径转换
我在玩Cygwin GCC,我想在Windows和Linux中使用glib的C语言中POSIX到DOS和DOS到POSIX的路径转换,c,gcc,cygwin,posix,dos,C,Gcc,Cygwin,Posix,Dos,我在玩Cygwin GCC,我想在Windows和Linux中使用glib的g_get_current_dir打印当前目录路径。问题是应用程序在windows中总是以posix格式打印路径。但我希望它在windows中以dos格式打印,在linux中以posix格式打印。我该怎么做?我知道cygpath实用程序,但这是一个外部实用程序,我正在寻找一个标准库函数或类似的东西,从C代码中实现这一点 有人能帮我吗 注意:我知道这是一个非常基本的问题,但在SO中找不到任何特别的问题,因此如果这是一个重复
g_get_current_dir
打印当前目录路径。问题是应用程序在windows中总是以posix格式打印路径。但我希望它在windows中以dos格式打印,在linux中以posix格式打印。我该怎么做?我知道cygpath实用程序,但这是一个外部实用程序,我正在寻找一个标准库函数或类似的东西,从C代码中实现这一点
有人能帮我吗
注意:我知道这是一个非常基本的问题,但在SO中找不到任何特别的问题,因此如果这是一个重复的问题,请给我指出正确的线程,我会很高兴地删除此线程。您可以使用
cygwin\u conv\u path
函数来完成此操作,在< p>中,可以使用<代码> CygWiNyVujyPrase< /Cuff>函数来完成这一操作,在 < p>中记录:这里是我已经找到的代码,它是CygPATH源代码(C++中的,所以根据我的需要修改了)
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int conv_dos_路径(char*文件名、int绝对_标志、char*转换_路径){
char*buf=NULL,*tmp;
wchar_t*buf2=NULL;
德沃德·伦=32768;
错误;
int print_tmp=0;
cygwin_conv_path_t conv_func=CCP_POSIX_TO_WIN_W
|(绝对标志?CCP绝对:CCP相对);
如果(!filename | |!filename[0]){
puts(“无法转换空路径”);
返回0;
}
buf=(char*)g_try_malloc(len);
buf2=(wchar_t*)g_try_malloc(len*sizeof(wchar_t));
如果(buf==NULL){
puts(“内存不足错误”);
返回0;
}
err=cygwin\u conv\u path(conv\u func,文件名,(void*)buf2,len);
如果(错误){
puts(“转换路径时出错”);
返回0;
}
wcstombs(buf、buf2、32768);
tmp=buf;
if(strncmp(buf,“\\\?\\”,4)=0){
len=0;
如果(buf[5]==':')
len=4;
否则如果(!strncmp(buf+4,“UNC\\”,4))
len=6;
如果(长度和长度(buf) <代码>这里是我已经找到的CygPATH源代码(它是C++的,所以根据我的需要修改了一点)< /P>的代码。
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int conv_dos_路径(char*文件名、int绝对_标志、char*转换_路径){
char*buf=NULL,*tmp;
wchar_t*buf2=NULL;
德沃德·伦=32768;
错误;
int print_tmp=0;
cygwin_conv_path_t conv_func=CCP_POSIX_TO_WIN_W
|(绝对标志?CCP绝对:CCP相对);
如果(!filename | |!filename[0]){
puts(“无法转换空路径”);
返回0;
}
buf=(char*)g_try_malloc(len);
buf2=(wchar_t*)g_try_malloc(len*sizeof(wchar_t));
如果(buf==NULL){
puts(“内存不足错误”);
返回0;
}
err=cygwin\u conv\u path(conv\u func,文件名,(void*)buf2,len);
如果(错误){
puts(“转换路径时出错”);
返回0;
}
wcstombs(buf、buf2、32768);
tmp=buf;
if(strncmp(buf,“\\\?\\”,4)=0){
len=0;
如果(buf[5]==':')
len=4;
否则如果(!strncmp(buf+4,“UNC\\”,4))
len=6;
如果(长度和长度(buf)
您是否考虑过检查cygpath
是如何实现的?可能有一个cygwin API完成了(大部分)工作。您是否考虑过检查cygpath
是如何完成的?可能有一个cygwin API完成了(大部分)工作。实际上,我已经按照Mat的建议通过查看cygpath源代码完成了这项工作。我也会在这里发布代码。感谢您指向正确的位置。:)事实上,我已经按照Mat的建议通过查看cygpath源代码实现了这一点。我也会在这里发布代码。感谢您指向正确的位置。:)
#include <windows.h>
#include <windef.h>
#include <sys/cygwin.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <glib-2.0/glib.h>
int conv_dos_path(char *filename, int absolute_flag, char *converted_path) {
char *buf = NULL, *tmp;
wchar_t *buf2 = NULL;
DWORD len = 32768;
ssize_t err;
int print_tmp = 0;
cygwin_conv_path_t conv_func = CCP_POSIX_TO_WIN_W
| (absolute_flag ? CCP_ABSOLUTE : CCP_RELATIVE);
if (!filename || !filename[0]) {
puts("Can't convert empty path");
return 0;
}
buf = (char *) g_try_malloc(len);
buf2 = (wchar_t *) g_try_malloc(len * sizeof(wchar_t));
if (buf == NULL) {
puts("Out of memory error.");
return 0;
}
err = cygwin_conv_path(conv_func, filename, (void *) buf2, len);
if (err) {
puts("Error while converting path.");
return 0;
}
wcstombs(buf, buf2, 32768);
tmp = buf;
if (strncmp(buf, "\\\\?\\", 4) == 0) {
len = 0;
if (buf[5] == ':')
len = 4;
else if (!strncmp(buf + 4, "UNC\\", 4))
len = 6;
if (len && strlen(buf) < PATH_MAX + len) {
tmp += len;
if (len == 6)
*tmp = '\\';
print_tmp = 1;
}
}
converted_path = memcpy(converted_path, tmp, strlen(tmp) + 1);
if (buf2)
g_free(buf2);
if (buf)
g_free(buf);
return 1;
}
char* get_real_path(char* filename){
char actualpath[PATH_MAX + 1];
char *ptr, *real_path;
ptr = realpath(filename, actualpath);
if(ptr == NULL){
char buf[256];
strerror_r(errno, buf, 256);
puts(buf);
return NULL;
}
real_path = (char*)g_malloc(strlen(ptr));
conv_dos_path(ptr, 1, real_path);
return real_path;
}
int main(int argc, char *argv[]) {
g_setenv("CYGWIN", "nodosfilewarning", 1);
char* path = get_real_path(argv[1]);
if(path)
puts(path);
g_free(path);
return 0;
}