C 如何在不显示dos窗口的情况下复制文件

C 如何在不显示dos窗口的情况下复制文件,c,C,我有以下代码来复制文件 sprintf(command, "copy /Y %s %s", sourceFile, targetFile); system(command); 除了dos窗口显示非常烦人之外,它还能工作 我正在尝试使用CreateProcess()(带有一个针对WINNT的#ifdef),但不确定如何设置相同的命令行。 在不显示dos窗口的情况下用C(在windows上)复制文件还有其他选项吗?以下是我从中提取的一些代码。您可以将其包装到自己的函数中,只需传递源文件路径和目标文

我有以下代码来复制文件

sprintf(command, "copy /Y %s %s", sourceFile, targetFile);
system(command);
除了dos窗口显示非常烦人之外,它还能工作

我正在尝试使用CreateProcess()(带有一个针对WINNT的#ifdef),但不确定如何设置相同的命令行。
在不显示dos窗口的情况下用C(在windows上)复制文件还有其他选项吗?

以下是我从中提取的一些代码。您可以将其包装到自己的函数中,只需传递源文件路径和目标文件路径(在本例中,
argv[1]
argv[2

#包括
#包括
int main(int argc,char*argv[])
{
文件*从,*到;
char ch;
如果(argc!=3){
printf(“用法:复制\n”);
出口(1);
}
/*开源文件*/
if((from=fopen(argv[1],“rb”))==NULL){
printf(“无法打开源文件。\n”);
出口(1);
}
/*打开目标文件*/
if((to=fopen(argv[2],“wb”))==NULL){
printf(“无法打开目标文件。\n”);
出口(1);
}
/*复制文件*/
而(!feof(from)){
ch=fgetc(来自);
如果(费罗(来自)){
printf(“读取源文件时出错。\n”);
出口(1);
}
如果(!feof(from))fputc(ch,to);
if(费罗(to)){
printf(“写入目标文件时出错。\n”);
出口(1);
}
}
如果(fclose(from)=EOF){
printf(“关闭源文件时出错。\n”);
出口(1);
}
如果(fclose(to)=EOF){
printf(“关闭目标文件时出错。\n”);
出口(1);
}
返回0;
}

有一些库可以做到这一点,或者你可以自己编写代码,使用缓冲区和fread/fwrite。我上次编写C代码时已经很长时间了,所以我想不起确切的语法。

使用ShellExecute和SW\u HIDE

Windows为此提供了一系列API。

\include
    #include<windows.h>
    #include<tchar.h>
    #include<shellapi.h>


    #define _UNICODE

    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
            PSTR szCmdLine, int iCmdShow)
    {

        SHFILEOPSTRUCT s={0};

        s.hwnd = GetFocus();
        s.wFunc = FO_COPY;
        s.pFrom = _T("d:\\songs\\vineel\\telugu\0\0");
        s.pTo = _T("d:\0");
        s.fFlags = 0;
        s.lpszProgressTitle = _T("Vineel From Shell - Feeling the power of WIN32 API");

        SHFileOperation(&s);
    }
#包括 #包括 #定义UNICODE int WINAPI WinMain(HINSTANCE HINSTANCE、HINSTANCE HPPreInstance、, PSTR szCmdLine,int iCmdShow) { SHFILEOPSTRUCT s={0}; s、 hwnd=GetFocus(); s、 wFunc=FO_副本; s、 pFrom=(d:\\songs\\vineel\\telugu\0\0); s、 pTo=_T(“d:\0”); s、 fFlags=0; s、 lpszProgressTitle=_T(“来自Shell的Vinel-感受WIN32 API的威力”); SHFileOperation&s; }

上面的代码将调用explorer copy handler…。

@Jacob这段代码很有效,但据我所知,fgetc()和fputc()的函数太慢了。@Neil:为什么它不复制空文件?@mosg:是的,如果你能使用这些API,我建议你使用它。@Jacob对于空文件,第一个feof()测试没有意义。然后fgetc()失败,然后ferror()失败表示该错误,然后程序出错。基本上写这篇文章的人对feof()的理解很差工作正常,而且在任何情况下复制文件都是一种可怕的方式。@Jacob看起来你对ferror的看法是正确的-我已经很久没有使用C文件流了。但是代码似乎过于复杂-为什么不简单地测试fgetc()的返回值呢?并且它不会在出现错误时正确关闭文件,这对于一个独立的程序来说并不重要,但是对于作为另一个程序的一部分使用的代码来说会很重要。这就是我要查找的。谢谢。我们如何使用ShellExecute()复制。没有找到该操作。
    #include<windows.h>
    #include<tchar.h>
    #include<shellapi.h>


    #define _UNICODE

    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
            PSTR szCmdLine, int iCmdShow)
    {

        SHFILEOPSTRUCT s={0};

        s.hwnd = GetFocus();
        s.wFunc = FO_COPY;
        s.pFrom = _T("d:\\songs\\vineel\\telugu\0\0");
        s.pTo = _T("d:\0");
        s.fFlags = 0;
        s.lpszProgressTitle = _T("Vineel From Shell - Feeling the power of WIN32 API");

        SHFileOperation(&s);
    }