我编了个读写文件的测试程序(用ShellExecute执行的)。即把数据写入文件,然后打开,删除。详细的代码如下:
       if(MessageBox("执行命令?","询问",MB_ICONQUESTION|MB_OKCANCEL)==IDOK)
{   
    ShellExecute(NULL,"open","E:\\1.txt",NULL,"E:\\1",SW_HIDE);
    MessageBox("执行成功!");
            remove("E:\\1.txt");

    前面的代码是把数据写入文件,写入是没有问题的,但是后面文件就打不开了,而且也删除不掉。但是把这段程序拿出MessageBox执行就一点问题没有。请问到底是哪出了问题?

解决方案 »

  1.   

    前面写入文件结束之后, 有没有 close 掉文件的handle? 我估计你是这个问题了
      

  2.   

       ShellExecute(NULL,"open","E:\\1.txt",NULL,"E:\\1",SW_HIDE);  没执行完就执行remove("E:\\1.txt"); 了
    中间加delay 函数 (可能还不行)最好用CreateProcess 函数 然后使用WaitForSingleObject(pi.hProcess,   INFINITE);    检测线程是否执行完毕,线程退出后再 remove 就没问题了
      

  3.   

        2楼的提示我觉得很有道理,不过之前那个“执行成功”的对话框是弹出来了的。我关闭了前面写文件的handle还是不能进行后面的操作,后面的读文件和删除文件都没有执行,中间的对话框却弹出来,真搞不懂了。
      

  4.   

    WaitForSingleObject(pi.hProcess,  INFINITE)  或Sleep(1)
      

  5.   

    ShellExecute(NULL,"open","E:\\1.txt",NULL,"E:\\1",SW_HIDE); 
    注意 前面另外开了一个线程 ,并没返回 就是说 你的open操作还在进行!
        MessageBox("执行成功!"); 并不说明 open函数执行完毕!!!!
      

  6.   

        10楼的意思是说我前面的写文件线程没有结束,所以后面的都无法执行?而MessageBox("执行成功!");语句不能说明前面的执行结束了是吧?
         那应该怎么关闭,我在写文件完后加了file.Close也不行啊!
      

  7.   

    可以使用
    ShellExecuteEx();
    然后
    WaitForSingleObject();
    remove("E:\\1.txt"); 
      

  8.   

    使用 CreateProcess 函数呀 ,然后用WaitForSingleObject();  函数等线程结束,再用remove("E:\\1.txt"); 
    或者之前 加一个延时函数 sleep(....)的延时一段时间,就行了。不过延时的方法不大保险,还是用 WaitForSingleObject();  等线程结束的方式比较好