IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

> Перехватить переименование файла
Unconnected
сообщение 11.06.2010 22:56
Сообщение #1


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Привет всем.

Допустим, есть файл или папка, путь и имя известны. Нужно отловить событие переименования этого файла или папки и получить новое имя. Такое возможно?


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
Unconnected
сообщение 12.06.2010 23:59
Сообщение #2


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Я немного изменил процедуру (убрал ненужные фильтры), получилось так:

type
PFileNotifyInformation = ^TFileNotifyInformation;
TFileNotifyInformation = record
NextEntryOffset: DWORD;
Action: DWORD;
FileNameLength: DWORD;
FileName: array [0..MAX_PATH - 1] of WideChar;
end;

var writepath:string;//нужное мне имя папки

Procedure monitor1(direc:string);
const
Filter = FILE_NOTIFY_CHANGE_FILE_NAME or
FILE_NOTIFY_CHANGE_DIR_NAME or
FILE_NOTIFY_CHANGE_CREATION or
FILE_NOTIFY_CHANGE_SECURITY;
var
Dir: THandle;
Notify: TFileNotifyInformation;
BytesReturned: DWORD;
newname:string;
begin
Dir := CreateFile(pchar(direc), GENERIC_READ,
FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE,
nil, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
if Dir <> INVALID_HANDLE_VALUE then
try
if not ReadDirectoryChangesW(Dir, @Notify, SizeOf(TFileNotifyInformation),
False, Filter, @BytesReturned, nil, nil) then
raise Exception.Create(SysErrorMessage(GetLastError))
else
case Notify.Action of
FILE_ACTION_RENAMED_NEW_NAME: newname:=notify.FileName;
end;
renamefile(newname,writepath);
finally
CloseHandle(Dir);
end;
end;
...
begin
monitor(writepath);
end.



, оставил те, которые не знаю, зачем нужны) В процедуру передаю путь к папке, имя которой надо мониторить. Кстати, в msdn написано: The function does not report changes to the specified directory itself. Это случаем не значит, что программа не будет смотреть изменения папки, в которой сама находится? (да, знаю, что в большинстве случаев переименовать папку с работающей программой внутри не получится).
Так вот, запускаю её единожды - программа виснет. В таймере если запускать, тоже виснет. Как надо?

Добавлено через 15 мин.
Цитата
Это случаем не значит, что программа не будет смотреть изменения папки, в которой сама находится?


Даа, кажется именно это и значит..


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Unconnected   Перехватить переименование файла   11.06.2010 22:56
volvo   Можно. С помощью функции MSDN -> ReadDirectoryC...   12.06.2010 0:29
Unconnected   Я немного изменил процедуру (убрал ненужные фильтр...   12.06.2010 23:59
volvo   Что значит "виснет"? У тебя синхронный в...   13.06.2010 0:41
volvo   Пример использования ReadDirectoryChangesW в отдел...   14.06.2010 10:57
Unconnected   У меня D2007 этот проект не открыла, говорит, там ...   14.06.2010 12:57
volvo   Какого именно, можешь уточнить? Я делал под D2009,...   14.06.2010 13:08
Unconnected   У меня Windows 7 Home Basic. Пробовал запускать св...   14.06.2010 18:07
volvo   Так я и под XP не под администратором, если что, з...   14.06.2010 18:14
volvo   Ты будешь смеяться, но: (Win7 Ultimate, запускал...   14.06.2010 18:59
Unconnected   Фигня какая-то.. И как я его уже только не пробова...   14.06.2010 23:18
volvo   Ну, понимаешь - тогда пробуй:   14.06.2010 23:47
Unconnected   Создал C:\1\555_21.png - работает.. Наве...   14.06.2010 23:53
Unconnected   Поставил D2009, скомпилировал начальные исходники ...   15.06.2010 23:39


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 13.07.2025 13:50
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"