我在Visual Studio 2010 Express中创建了一个应用程序。首先我编译了一个调试版本,它完全可以工作,但在编译发布版本后它会冻结
我的申请应该是这样的:
我已经将BIOS版本收集到所有桌面,它将自动更新BIOS版本。它们位于网络共享中,例如\ myserver \ bios_update。 \\ myserver \ bios_update \ Log中还有一个Log文件夹。我的应用程序将通过以下方式在此日志文件夹中创建一个日志文件:\\ myserver \ bios_update \ log \ OptiPlex 780 \ hostname.txt当然OptiPlex 780是PC的模型类型,如果它不存在,它将因为有许多PC模型类型而被创建。如果hostname.txt(主机名被计算机主机名替换)不存在,则也会创建它。
有趣的是,目前它工作正常,但在编译发布版本后,我的应用程序采用以下方式。如果hostname.txt存在,那么它工作正常,但如果没有,那么它将冻结。它就像是在无限循环,但我不知道为什么(我打印了一些数据,我知道这就是为什么我说无限循环)。
我注意到以下事项: 这将是我的应用程序冻结:if(folderexists(LogFolder)) LogFolder包含一个类似\\ myserver \ bios_update \ Log \的路径 如果hostname.txt不存在,我的应用程序将冻结,但如果它存在,那就没关系。另外如果我给LogFolder没有最后的\ like \ myserver \ bios_update \ Log那么它也没关系。 这是我的代码:
bool folderexists( char * foldername )
{
if ( _access( foldername, 0 ) == 0 )
{
struct stat status;
stat( foldername, &status );
if ( status.st_mode & S_IFDIR )
{
//cout << "\nThe directory exists." << endl;
return true;
}
else
{
//cout << "\nThe path you entered is a file." << endl;
WriteToLog( "The path you entered is a file??????????????????", false );
return false;
}
}
else
{
//cout << "\nPath doesn't exist." << endl;
return false;
}
}//folderexists
void WriteToLog( char * text, bool star )
{
char time[ SMALL ], LogModel[ MEDIUM ], Day[ SMALL ], Month[ SMALL ];
FILE *logfile;
memset( time, 0, sizeof( time ) );
memset( Day, 0, sizeof( Day ) );
memset( Month, 0, sizeof( Month ) );
SYSTEMTIME lt;
GetLocalTime( < );
GetDayAndMonth( lt.wDayOfWeek , Day, lt.wMonth, Month );
sprintf( time, "[%s %s %d %02d:%02d:%02d]", Day, Month, lt.wDay, lt.wHour, lt.wMinute, lt.wSecond );
//printf("\nThe local time is: %02d:%02d\n", lt.wHour, lt.wMinute);
if ( !file_exists( LogFile ) )
{
memset( LogModel, 0, sizeof( LogModel ) );
strcpy( LogModel, LogFolder );
strcat( LogModel, PCModel );
if ( folderexists( LogFolder ) ) <== Here is where my App freeze!!!!!!!
{
if ( !folderexists( LogModel ) )
{
if ( !CreateDirectoryA( LogModel, NULL ) ) ShowError( "CreateDirectoryA .............................. Failed! ( creating LogModel folder ) ", true, true );
}
}
else
{
printf( "\nLogFolder isn't reachable!" );
exit(-1);
}
}//file_exists
if ( ( logfile = fopen( LogFile, "a" ) ) == NULL )
{
ShowError( "Failed to create Logfile!", false, true );
}
else
{
fputs( time, logfile );
fputs( " - ", logfile );
fputs( text, logfile );
fputs( "\n", logfile );
if ( star ) fputs( "**********************************************************************************************************************\n", logfile );
fclose( logfile );
//if ( star ) exit( -1 );
}
}//WriteToLog
任何建议都是适当的,因为它让我发疯,我无法弄明白,问题是什么。
答案 0 :(得分:1)
它以递归方式调用自己。在FolderExists中调用WriteToLog,如果调用WriteToLog的FolderExists调用,如果调用WriteToLog的FolderExists调用,则调用调用WriteToLog调用的FolderExists调用的文件,如果FolderExists调用WriteToLog,则调用,如果调用FolderExists调用,则调用如果调用FolderExors调用,则调用FolderExists调用的文件,如果FolderExists调用WriteToLog调用,则调用的文件,如果FolderExists调用WriteExo调用,则调用,如果调用WriteToLog等的FolderExists