Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.12.2014, 07:57   #21
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
есть API-функции, которые копируют файл. Если файл открыт, то возникает ошибка.
Это часный случай, когда файл открыт эксклюзивно. И то даже при таком раскладе можно будет откопировать. Это не показатель. Нужно выяснять по хендлам, а не монтировать турбонадув в грабли.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.12.2014, 08:04   #22
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 906
По умолчанию

Stilet, я не пробовал API-функцию, которая копирует файлы. Копирование предложил пользователь Полный 30h.

Но в языке программирования VBA есть функция FileCopy, которая не позволяет копировать, если файл открыт. Файлы бывают разные, поэтому может быть для каких-то файлов копирование не вызовет ошибку. Excel-файлы нельзя копировать с помощью VBA-функции FileCopy, если Excel-файл открыт. Я предположил, что есть API-функция, которая работает аналогично VBA-функции FileCopy.
Скрипт вне форума Ответить с цитированием
Старый 08.12.2014, 09:39   #23
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
Файлы бывают разные, поэтому может быть для каких-то файлов копирование не вызовет ошибку
Не файлы а способы их открытия. Если файл открыт с shareddeny то скорее всего его открыть другим не удастся, но можно открыть хитро. Все зависит от механизма открытия\копирования\переименования и тд.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.12.2014, 10:39   #24
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а давайте пойдем от противного, зачем вам знать открыть ли файл?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 08.12.2014, 11:50   #25
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 906
По умолчанию

Пепел Феникса, задача такая: нужно внести изменения в несколько файлов.

Сложность: если файлы находятся на сетевом компьютере, то какой-то пользователь может открыть файл и тогда нельзя будет внести изменения в файл.

Поэтому удобнее сначала проверить, закрыты ли файлы, а затем уже начать работу.
Скрипт вне форума Ответить с цитированием
Старый 08.12.2014, 12:13   #26
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

А чем не устраивает проверка путем открытия файла?
Все равно другая проверка вам ничего не даст - мы живем в многопоточном мире.
Проверка скажет "файл не используется" но пока вы его откроете его откроет кто-то другой, и что тогда делать?
waleri вне форума Ответить с цитированием
Старый 08.12.2014, 12:14   #27
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от Скрипт Посмотреть сообщение
Пепел Феникса, задача такая: нужно внести изменения в несколько файлов.

Сложность: если файлы находятся на сетевом компьютере, то какой-то пользователь может открыть файл и тогда нельзя будет внести изменения в файл.

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

если используете Делфи то применяйте try/except, если WinAPI чистый то анализируйте результат от CreateFile(а потом GetLastError).
в общем так или иначе обрабатывайте ошибки, отказано в открытии файла может быть по многим причинам(например админ с правами напортачил).

И запрашивайте только нужные вам права на файл, в том числе блокировки.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 08.12.2014, 12:21   #28
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 906
По умолчанию

waleri, я не программист, поэтому мне кажется нелогичной ситуация, когда, чтобы узнать, используется файл или нет, его нужно открыть. Мне со стороны кажется это неправильным и глупым. Поэтому поинтересовался, может быть есть прямой способ узнать, открыт файл или нет. Подумал, может быть для этого есть API-функция.
Выбора нет, поэтому я так и буду делать - открывать файл в определённом режиме и смотреть, произошла ошибка или нет.
По поводу того, что файл может быть открыт после проверки. Это усложнит, но такое может быть не очень часто и пользователям не прибавит неудобств.

Последний раз редактировалось Скрипт; 08.12.2014 в 12:24.
Скрипт вне форума Ответить с цитированием
Старый 08.12.2014, 12:21   #29
Полный 30h
Пользователь
 
Аватар для Полный 30h
 
Регистрация: 10.12.2011
Сообщений: 26
По умолчанию

Цитата:
Сообщение от Скрипт Посмотреть сообщение
Пепел Феникса, задача такая: нужно внести изменения в несколько файлов.

Сложность: если файлы находятся на сетевом компьютере, то какой-то пользователь может открыть файл и тогда нельзя будет внести изменения в файл.

Поэтому удобнее сначала проверить, закрыты ли файлы, а затем уже начать работу.
Так в чём проблема? Открываешь с правами редактирования с обязательной проверкой на ошибку. Если кем то файл и открыт, то всё зависит от того что выставил этот "кто то" в dwShareMode, если кто то не выставил FILE_SHARE_WRITE, то выдаст ошибку на открытие. Это по сути и будет сигналом того что файл пользуют. А если файл с правами записи FILE_SHARE_WRITE то он тебе откроется. И какая собственно разница кем он ещё открыт, меняй в нём что угодно на здоровье.
В конце концов если этому кому то критично что содержимое изменится, то это его головная боль, нефиг было FILE_SHARE_WRITE указывать.
Меня постоянно преследуют умные мысли, но я быстрее!
Полный 30h вне форума Ответить с цитированием
Старый 08.12.2014, 12:25   #30
Полный 30h
Пользователь
 
Аватар для Полный 30h
 
Регистрация: 10.12.2011
Сообщений: 26
По умолчанию

Цитата:
Сообщение от Скрипт Посмотреть сообщение
waleri, я не программист, поэтому мне кажется нелогичной ситуация, когда, чтобы узнать, используется файл или нет, его нужно открыть. Мне со стороны кажется это неправильным и глупым.
Всё вполне логично, твоя основная задача по сути файл всё же открыть. Ты пробуешь, если не открывается значит занято.
Меня постоянно преследуют умные мысли, но я быстрее!
Полный 30h вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как программно определить, что файл уже кем-то открыт? AlexSoft777 Общие вопросы Delphi 6 05.07.2011 22:05
Проверка открыт ли файл в сети Klim Bassenger Microsoft Office Excel 4 29.09.2010 20:50
Как определить закрыт или открыт текстовый файл ZvEr_HaCkEr Общие вопросы Delphi 3 28.07.2010 17:33
Из программы 1.exe создаем пустой файл 2.exe. Как из программы 1 внести API функции в программу 2? X-LEV-X Общие вопросы Delphi 7 09.03.2010 08:33
Как узнать, открыт ли файл? #32 Microsoft Office Excel 5 30.10.2009 12:04