Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中POSIX到DOS和DOS到POSIX的路径转换_C_Gcc_Cygwin_Posix_Dos - Fatal编程技术网

C语言中POSIX到DOS和DOS到POSIX的路径转换

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中找不到任何特别的问题,因此如果这是一个重复

我在玩Cygwin GCC,我想在Windows和Linux中使用glib的
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;
}