[ marko_81 @ 19.11.2008. 10:17 ] @
Imam sledecu situaciju. Treba da procitam neke podatke iz .txt fajla i da kasnije upisem neke nove podatke u isti fajl.
Ukoliko je fajl zatvoren, sve radi kako treba, ali ako fajl neko otvori pre, onda mi izbacuje poruku:
Encountered a sharing violation while accessing putanja_do_fajla

Fajl citam sledecom naredbom:
Code:
pFileOld = new CFile(filePath, CFile::modeRead);


Ima li neko ideju kako bi moglo (i da li bi moglo) da se detektuje da je fajl otvoren i ako jeste da se programski zatvori
ili vec neku drugu ideju kako bi pomenuti problem mogao da se resi?

Unapred zahvalan.
[ kiklop74 @ 19.11.2008. 12:09 ] @
Citat:
marko_81: Imam sledecu situaciju. Treba da procitam neke podatke iz .txt fajla i da kasnije upisem neke nove podatke u isti fajl.
Ukoliko je fajl zatvoren, sve radi kako treba, ali ako fajl neko otvori pre, onda mi izbacuje poruku:
Encountered a sharing violation while accessing putanja_do_fajla

Fajl citam sledecom naredbom:
Code:
pFileOld = new CFile(filePath, CFile::modeRead);


Ima li neko ideju kako bi moglo (i da li bi moglo) da se detektuje da je fajl otvoren i ako jeste da se programski zatvori
ili vec neku drugu ideju kako bi pomenuti problem mogao da se resi?

Unapred zahvalan.


Moglo bi da se detektuje da li je fajl vec otvoren ali ako nije otvoren od strane tvoje aplikacije onda ne moze da se programski zatvori.

Jedan od nacina kako detektovati da li je fajl ekskluzivno otvoren.

Code:
bool file_is_open_exclusive(const char* fname) {
    HANDLE h = ::CreateFile( fname
                            ,GENERIC_WRITE
                            ,0
                            ,NULL
                            ,OPEN_ALWAYS
                            ,FILE_ATTRIBUTE_NORMAL
                            ,NULL
                            );
    DWORD lerr = ::GetLastError();
    bool opened = (h != INVALID_HANDLE_VALUE);
    if (opened) {
        ::CloseHandle(h);
        h = NULL;
    }

    return !opened && (lerr == ERROR_SHARING_VIOLATION);
}


[ deerbeer @ 19.11.2008. 12:22 ] @
Mozes i ovako s obzirom da koristis MFC :
Code:

int GetFileStatus (CString filePath) 
{
int status = CFileException::none; 

try 
{
   pFileOld = new CFile(filePath, CFile::modeRead);
   pFileOld->Close() ; 
}
catch (CFileException* pFileExc) 
{
   switch (pFileExc->m_cause) 
    { 
           case   CFileException ::sharingViolation : 
             status = CFileException ::sharingViolation ; 
            break ; 
           case CFileException::accessDenied : 
            status = CFileException ::accessDenied ; 
            break ; 
            ...itd .. 

     } 

pFileExc->Delete () ; 

}

retrurn status ; 
}