Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Чтение заблокированого файла с помощью CreateFile  (Прочитано 28813 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Paul
Участник

ru
Offline Offline
Пол: Мужской

« : 30-06-2010 11:19 » 

Есть программа работающая с файлом, нужно этой файл прочитать из другой. При попытке открытия файла для чтения получаю INVALID_HANDLE_VALUE, при этом через fopen("my.file","r") всё читается нормально.

Код:
m_h=CreateFile("my.file",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_READONLY,NULL);
if(m_h==INVALID_HANDLE_VALUE)
{
int h=GetLastError();
AddToLog("Открытие файла ... Error!");
return;
}
« Последнее редактирование: 01-07-2010 04:40 от Paul » Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 30-06-2010 12:48 » 

А GetLastError что говорит?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 30-06-2010 18:52 » 

а так

m_h=CreateFile("my.file",GENERIC_READ,0,0,OPEN_EXISTING,0,0);
Записан

Paul
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 01-07-2010 04:28 » 

GetLastError возвращает 32 (The process cannot access the file because it is being used by another process.)

Цитата
m_h=CreateFile("my.file",GENERIC_READ,0,0,OPEN_EXISTING,0,0);

Не помогает.

Добавлено в 2010-07-01, 08:40:00:
В общем проблема решалась таким вот способом.
Код:
CreateFile(protName+".grp", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 01-07-2010 10:58 » 

Паш, загадка какая-то ))

Цитата: MSDN
FILE_SHARE_READ Разрешает последующие операции открытия объекта, которые требуют доступа для  чтения. В противном случае, другие процессы не смогут открыть объект, если они потребуют доступа для чтения.
Если этот флажок не определяется, но объект уже был открыт с доступом для чтения, то функция завершается ошибкой.
 
FILE_SHARE_WRITE Разрешает последующие операции открытия объекта, которые требуют доступа для  записи. В противном случае, другие процессы не смогут открыть объект, если они потребуют доступа для записи.
Если этот флажок не определяется, но объект уже был открыт с доступом для записи, то функция завершается ошибкой.

то есть, важно то, как открыли файл ДО твоей программы: а именно, там должны были указать FILE_SHARE_READ, чтобы ты смог открыть файл с GENERIC_READ

а сочетание FILE_SHARE_READ | FILE_SHARE_WRITE к этому всему отношения имхо не имеет - это лишь позволит другим приложениям тоже потом совместно открыть файл
« Последнее редактирование: 06-07-2010 02:51 от Алексей1153++ » Записан

Paul
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 05-07-2010 16:43 » 

Тоже не понял почему, но главное работает Улыбаюсь
Записан
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 05-07-2010 18:43 » 

Ну если Леша написал правду (лень МСДН открывать), а именно

Если этот флажок не определяется, но объект уже был открыт с доступом для записи, то функция завершается ошибкой.

тогда чего тут непонятного. Всё так и получается.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 06-07-2010 02:52 » 

resource, цитата была как раз из МСДН )

Паш, наверное, твоя программа открывала файл, а потом она же (другой экземпляр) снова открывала. Вот такой эффект и вышел
Записан

resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 06-07-2010 09:31 » 

Я так понял, что об этом и было написано.

Есть программа работающая с файлом, нужно этой файл прочитать из другой
Записан
Paul
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 06-07-2010 09:46 » 

Лёх, программы открывающие файл - разные.  Первая, которая изначально открывает файл написана неизвестным автором на делфях, вторая пишется мной.
в общем как выйдешь из отпуска покажу тебе.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #10 : 10-09-2010 03:29 » 

о, кстати! Похожая фигня попалась на днях, только решилась по другому: лог-файл одной программы прекрасно открывался в блокноте, но отказывался открываться из программы при помощи CreateFile под предлогом "файл занят другим процессом". Но указание этих двух флагов (авось поможет) не дало результатов, поэтому сделал иначе: скопировал файл и открыл копию )) Мне только чтение нужно было.
Записан

baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #11 : 12-09-2010 15:05 » 

Алексей1153++, +1 у меня аналогичная ситуация была. Сделал втупую копирование и чтение, чтоб не разбираться долго Улыбаюсь
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #12 : 12-09-2010 16:17 » 

baldr, а осадок остался... Ведь блокнот как-то же открывает, зараза! ))
Записан

baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #13 : 12-09-2010 16:21 » 

Алексей1153++, прямой доступ к диску Улыбаюсь Улыбаюсь
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #14 : 12-09-2010 16:24 » 

да сильно сомневаюсь, что блокнотяра такой продвинутый Улыбаюсь
Записан

resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #15 : 14-09-2010 04:53 » 

Леш, ну флаги не те указал, вот и все. Тут никакой мистики быть не может.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #16 : 14-09-2010 05:09 » 

resource, а какие надо ТЕ флаги? ))
Записан

resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #17 : 14-09-2010 06:16 » 

Это всегда зависит от ситуации. Я же не знаю, какие флаги ты там поставил.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #18 : 14-09-2010 06:40 » 

resource, я поставил сначала 0, потом пробовал с generic_read|generic_write.  А лог не мой - его другая программа создаёт
Записан

resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #19 : 14-09-2010 20:57 » 

Если тебе только читать надо, ставь только GENERIC_READ. И еще немаловажно что задано в dwShareMode. Многие люди не парятся особо с этим параметром, и ставят совсем не то, что надо. Но как я понял по предыдущим постам, ты с ним знаком в достаточной степени.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #20 : 15-09-2010 05:42 » 

в общем, дело ясное , что дело тёмное Улыбаюсь

dwShareMode мне тут мало поможет, так как та, другая, программа могла там 0 поставить. Но блокнот всё же как-то открывает ))

Цитата
Но как я понял по предыдущим постам, ты с ним знаком в достаточной степени
Судя по всему, в недостаточной (
Записан

resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #21 : 16-09-2010 05:44 » 

Да ничего темного. Ставь GENERIC_READ и (FILE_SHARE_READ | FILE_SHARE_WRITE).

ЗЫ это все с учетом того, что блокнот все-таки открывает файл
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #22 : 16-09-2010 06:18 » 

Да ничего темного. Ставь GENERIC_READ и (FILE_SHARE_READ | FILE_SHARE_WRITE).

ЗЫ это все с учетом того, что блокнот все-таки открывает файл
ставил и так, и всяко по-другому  пробовал, один хрен Улыбаюсь А блокнот открывает Отлично Заразо такое.
Записан

resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #23 : 16-09-2010 22:45 » 

Леш, не верю (как Станиславский). Давай посмотрим. Как воспроизвести это дело?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #24 : 17-09-2010 03:29 » 

Леш, не верю (как Станиславский). Давай посмотрим. Как воспроизвести это дело?

resource, хм.. Ты не согласишься на этот эксперимент Улыбаюсь) В общем, нужно:
1) установить MS Essential
2) обновить его по самое нехочу (а то проверять откажется)
3) добыть файл, заражённый вирусом
4) проверить этот файл
5) вот далее начинается песня: mse делает лог, который в блокноте я могу просмотреть, а из своей программы не могу напрямую подступиться (вертается ошибка "файл занят другим процессом").

Вроде все условия рассказал ? ))
Записан

resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #25 : 20-09-2010 19:59 » 

Ну не то чтобы я не согласился, просто дома не вполне лицензия (винда) стоит ) а как он будет обновляться при таком раскладе не знаю. Так то на виртуалке можно было попробовать. А обновления можно качнуть откуда-нибудь и подсунуть ему ?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #26 : 21-09-2010 03:29 » 

resource, я ставил на виртуалбоксе семёрку, а туда MSE. Он вроде проверял, лицензионная или нет, но сказал - всё ОК. Обновился по тырнету, заработал
Записан

resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #27 : 21-09-2010 06:37 » 

На выходных попробую, если конечно не проведу их на работе, как прошлые.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #28 : 21-09-2010 06:39 » 

ок Улыбаюсь
у тебя ещё и выходные бывают ? Шикуешь! (с) Отлично
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #29 : 21-09-2010 07:08 » 

Нда... Нехорошо. По выходным надо работать дома.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines