fopen在调用之前打开File

时间:2011-11-06 19:22:22

标签: c file fopen autoit createprocess

首先是我的代码:

void RecvPaths(char *szRETURN)
{
    FILE *hFILE;
    char *szFILE = new char[2048];
    hFILE = fopen("FLM.tmp", "r");

    do
    {
        fgets(szFILE, 2048, hFILE);
        strcat(szRETURN, szFILE);
    } while(!feof(hFILE));

    fclose(hFILE);
    return;
}

现在我的问题: 我启动包含此功能的程序。它使用CreateProcess创建一个新流程。这种方式调用的程序应该将一些数据写入" FLM.tmp"。完成后,我调用此函数来读取由其他程序写入的数据。但它总是一无所获。我还用Windows资源管理器打开了文件,但也没有。所以我检查了其他程序,这肯定是有效的。接下来,我尝试更改此函数中fopen的路径,让其他程序中的路径保持不变,现在将其数据写入" FLM.tmp"。就像我的prog在开始新进程之前打开这个文件并且它阻止了它。但我从来没有在我的编程的另一部分打开这个文件。有谁知道什么可以解决这个问题?

编辑:好的,有些人想要第二个程序的代码。这里是。 (它是用AutoIt编写的):

#include <File.au3>
#include <Array.au3>

Local $aFilelist, $sFilelist, $i, $hFile

$hFile = FileOpen(@ScriptDir & "\FLM.tmp", 2)


If $CmdLine[0] = 0 Then
    $aFilelist = DriveGetDrive("ALL")
Else
    For $i = 2 To $CmdLine[0]
        $CmdLine[1] = $CmdLine[1] & " " & $CmdLine[$i]
    Next

    $aFilelist = _FileListToArray($CmdLine)
EndIf

_ArrayDelete($aFilelist, 0)
$sFilelist = _ArrayToString($aFilelist, @CRLF)
FileWrite($hFile, $sFilelist)
FileClose($hFile)
Exit

而且,当我在没有第一个程序的情况下自己启动时,它就可以了。


我有点困惑,但现在它有效。也许这是我系统的一个问题,我不知道。但是,谢谢你的所有答案。

2 个答案:

答案 0 :(得分:1)

您正在传递fopen()的相对路径,因此它可能正在打开您不期望的另一个文件夹中的文件,因为调用进程的工作目录可以动态更改。打开文件时始终使用绝对路径。

答案 1 :(得分:0)

一些评论:

(1)你有一个内存泄漏 - 你永远不会删除szFILE。

(2)你应该指定一个最大大小作为函数的附加参数,这样就不会有意外的内存覆盖

RecvPaths( char* szRETURN, size_t maxLength )

(3)因为声明方法返回void,所以函数末尾不需要空return;

(4)您应该验证其他程序/进程是否正确关闭文件,如果文件仍然打开,可能会导致您的问题,因为文件内容可能没有刷新到磁盘。

(5)在Windows中,处理文件IO的推荐方法是使用Windows特定的方法,例如: CreateFile()可以处理Windows文件权限等内容,并在发生错误时为您提供更具描述性的错误消息。