2014-01-21 2 views
5

Есть ли способ в C++ обнаружить, что файл уже открыт в другой программе ?.
Я хочу удалить и переписать некоторые файлы, но если файл открыт, я хочу отобразить сообщение об ошибке. Я использую ОС Windows.Обнаруживать, открыт ли файл в C++

+1

Аналогичный вопрос уже был задан и ответ, прежде: https://stackoverflow.com/questions/13691603/whats-a-programmatic-way-to-detect-if-a- file-is-open-in-windows? rq = 1 – jpw

ответ

10

Принимая действие в зависимости от результата «является открытие файла запроса» условие гонки (запрос возвращает false, а затем программа открывает файл перед программа пытается удалить его, например) ,

Попытка удалить файл с помощью DeleteFile(), и если он не отображает причину неудачного удаления файла, используя GetLastError(). См System Error Codes для списка кодов ошибок (ERROR_SHARING_VIOLATION в котором говорится «Процесс не может получить доступ к файлу, так как он используется другим процессом.»)

+0

При каких условиях файл может быть открыт программой, если я сам его не открываю? Это немного сбивает меня с толку. Не могли бы вы привести несколько примеров? – AlexandraC

+0

@AlexandraC, я не уверен, что вы подразумеваете под «если я не открываю его сам»? Если файл существует, любая программа может попытаться открыть его, если захочет. Разумным примером может служить проверка на вирусы, которая может периодически открывать файлы для проверки содержимого. – hmjd

+0

спасибо за ответ, это очень полезно. Я хотел знать, почему программа хочет открыть файл. Есть ли какая-либо документация, где я могу больше узнать об этой теме? – AlexandraC

0
#include <iostream>  // std::cout 
#include <fstream>  // std::ofstream 

int main() { 
    std::ofstream ofs; 
    ofs.open ("example.txt"); 
    if (ofs.is_open()) 
    { 
    ofs << "anything"; 
    std::cout << "operation successfully performed\n"; 
    ofs.close(); 
    } 
    else 
    { 
    std::cout << "Error opening file"; 
    } 
    return 0; 
} 
+0

... а затем какой-то другой процесс открывает файл между 'close' и вашей попыткой удалить его ... – molbdnilo

+0

@molbdnilo: Я точно не понял. Это что-то о синхронизации доступа к файлу двумя процессами? – CreativeMind

+0

Да, см. Ответ hmjd. Нет никакого смысла в вашем тесте, поскольку он может быть признан недействительным в любое время после этого. (Предполагая предустановленную многозадачную ОС.) – molbdnilo

0

Вы можете использовать CreateFile API function с режимом акций NULL, который открывается файл для исключительного использования.

0

вы можете использовать is_open(), чтобы проверить, открыт ли файл. Если это вы можете закрыть или сделать что-то еще. Вот exampe:

int main() 
{ 

    fstream filestr; 
    filestr.open ("test.txt"); 

    if (filestr.is_open()) 
    { 

    filestr << "File successfully open"; 
    filestr.close(); 

    } 

    else 
    { 

    cout << "Error opening file"; 

    } 

return 0; 
} 
+2

Это не будет проверять, открыт ли файл в других программах, только если вам удалось открыть его для себя. – zenzelezz

Смежные вопросы