CStdioFile第一次打开文件成功,第二次失败,为何?

时间:2022-09-29 16:33:20

CStdioFile FontenFile,KTenFile;
//CFileException fileException;
if ( !FontenFile.Open( ExePath+"\\fonten.txt", CFile::modeRead, &fileException ) )
{
((CListBox *)(pWnd->GetDlgItem(IDC_LIST1)))->AddString("Can't open fonten.txt....");
pWnd->GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE);
pWnd->GetDlgItem(IDC_BUTTON2)->EnableWindow(TRUE);
::CoUninitialize();
DWORD EXITCODE;
GetExitCodeThread(g_pThread,&EXITCODE);
AfxEndThread(EXITCODE);
return TRUE;
TRACE( _T("Can't open file %s, error = %u\n"),ExePath, fileException.m_cause );

if ( !KTenFile.Open( ExePath+"\\KTen.txt", CFile::modeRead, &fileException ) )
{
((CListBox *)(pWnd->GetDlgItem(IDC_LIST1)))->AddString("Can't open KTen.txt....");
pWnd->GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE);
pWnd->GetDlgItem(IDC_BUTTON2)->EnableWindow(TRUE);
::CoUninitialize();
DWORD EXITCODE;
GetExitCodeThread(g_pThread,&EXITCODE);
AfxEndThread(EXITCODE);
return TRUE;
TRACE( _T("Can't open file %s, error = %u\n"),ExePath, fileException.m_cause );


KTEN第二次无论如何都不能打开
第一次打开后,绝对有close,这个不用怀疑

8 个解决方案

#1


这种一般都是没Close造成的。

但是楼主说不是,那好
1.Throw读取Exception看结果吧
2.getlastError直接ErrorLookup

#2


从你的代码看 就可能有问题
if(FontenFile.Open()) //成功
{
}
if(KTenFile.Open()) //失败
{
  //FontenFile没有关闭
  return ;
}

#3


引用 1 楼 tiger9991 的回复:
这种一般都是没Close造成的。

但是楼主说不是,那好
1.Throw读取Exception看结果吧
2.getlastError直接ErrorLookup

KTenFile.close后面加个KTenFile.~CStdioFile();就好了
我单单close还不行么。。。。。

#4


引用 2 楼 zgl7903 的回复:
从你的代码看 就可能有问题
if(FontenFile.Open()) //成功
{
}
if(KTenFile.Open()) //失败
{
  //FontenFile没有关闭
  return ;
}

两个txt第一次都可以打开,第二次FontenFile可以打开,kten不行

#5


引用 1 楼 tiger9991 的回复:
这种一般都是没Close造成的。

但是楼主说不是,那好
1.Throw读取Exception看结果吧
2.getlastError直接ErrorLookup

查到了,sharingViolation
不明白为何。。。。 

#6


1:CoUninitialize()为何多次调用,这函数一个线程只能调用一次就好了解,你这里有两处调用。
2另外你的程序是多线程的么,sharingViolation是共享违例,我把它称为共享强奸,线程的执行不同步,导致一个占用,另一个却要打开,会出现sharingViolation,需要线程同步/锁这类的。如果不是多线程,有可能文件太大,虽然代码已经执行了close,但文件写入物理介质时需要较长时间,也会导致文件被占用,第二次打开时出现sharingViolation。

#7


另一个程序正在使用此文件,进程无法访问。

#8


引用 6 楼 mlqxj35674 的回复:
1:CoUninitialize()为何多次调用,这函数一个线程只能调用一次就好了解,你这里有两处调用。
2另外你的程序是多线程的么,sharingViolation是共享违例,我把它称为共享强奸,线程的执行不同步,导致一个占用,另一个却要打开,会出现sharingViolation,需要线程同步/锁这类的。如果不是多线程,有可能文件太大,虽然代码已经执行了close,但文件写入物理介质时需要较长时间,也会导致文件被占用,第二次打开时出现sharingViolation。

kten比fonten小好多好多

#1


这种一般都是没Close造成的。

但是楼主说不是,那好
1.Throw读取Exception看结果吧
2.getlastError直接ErrorLookup

#2


从你的代码看 就可能有问题
if(FontenFile.Open()) //成功
{
}
if(KTenFile.Open()) //失败
{
  //FontenFile没有关闭
  return ;
}

#3


引用 1 楼 tiger9991 的回复:
这种一般都是没Close造成的。

但是楼主说不是,那好
1.Throw读取Exception看结果吧
2.getlastError直接ErrorLookup

KTenFile.close后面加个KTenFile.~CStdioFile();就好了
我单单close还不行么。。。。。

#4


引用 2 楼 zgl7903 的回复:
从你的代码看 就可能有问题
if(FontenFile.Open()) //成功
{
}
if(KTenFile.Open()) //失败
{
  //FontenFile没有关闭
  return ;
}

两个txt第一次都可以打开,第二次FontenFile可以打开,kten不行

#5


引用 1 楼 tiger9991 的回复:
这种一般都是没Close造成的。

但是楼主说不是,那好
1.Throw读取Exception看结果吧
2.getlastError直接ErrorLookup

查到了,sharingViolation
不明白为何。。。。 

#6


1:CoUninitialize()为何多次调用,这函数一个线程只能调用一次就好了解,你这里有两处调用。
2另外你的程序是多线程的么,sharingViolation是共享违例,我把它称为共享强奸,线程的执行不同步,导致一个占用,另一个却要打开,会出现sharingViolation,需要线程同步/锁这类的。如果不是多线程,有可能文件太大,虽然代码已经执行了close,但文件写入物理介质时需要较长时间,也会导致文件被占用,第二次打开时出现sharingViolation。

#7


另一个程序正在使用此文件,进程无法访问。

#8


引用 6 楼 mlqxj35674 的回复:
1:CoUninitialize()为何多次调用,这函数一个线程只能调用一次就好了解,你这里有两处调用。
2另外你的程序是多线程的么,sharingViolation是共享违例,我把它称为共享强奸,线程的执行不同步,导致一个占用,另一个却要打开,会出现sharingViolation,需要线程同步/锁这类的。如果不是多线程,有可能文件太大,虽然代码已经执行了close,但文件写入物理介质时需要较长时间,也会导致文件被占用,第二次打开时出现sharingViolation。

kten比fonten小好多好多