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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.05.2011, 13:27   #1
vbilash
 
Регистрация: 18.12.2009
Сообщений: 7
Радость Следить за изменениями в каталоге

Здраствуйте всем! Подскажите не опытному программисту как мне узнать имя изменяемого файла или каталога?
Я написал программу которая следит за изменениями в каталоге. Все прекрасно работает, отслеживает все изменения, удаления, переименование, создание и прочие.... Но как только происходит изменение в каталоге, моя программа фиксирует, не непишет ИМЯ изменяемого ФАЙЛА или ДИРЕКТОРИИ!!!!
Полскажите если Вам не трудно.....спасибо)
vbilash вне форума Ответить с цитированием
Старый 19.05.2011, 13:41   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Ну так очевидно, у Вас ошибка в 42 и 57 строчках исходного кода!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.05.2011, 13:42   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

разбирайся=)
Код:
unit ThreadForScan;

interface

uses
  Classes, Windows, SysUtils;

type
  TScanThread = class(TThread)
  private
    Dir : string;
    SubDirs : Boolean;
    EventLog : string;
    procedure AddEvent;
  protected
    procedure Execute; override;
  public
    constructor Create(CreateSuspended : Boolean; const _Dir : string; _SubDirs : Boolean);
  end;

implementation

uses DlgMain;

constructor TScanThread.Create;
begin
  inherited Create(CreateSuspended);
  Dir := _Dir;
  SubDirs := _SubDirs;
end;

procedure TScanThread.AddEvent;
begin
  frmMain.lbChanges.Items.Add(EventLog);
end;

procedure TScanThread.Execute;
type
  FILE_NOTIFY_INFORMATION = record
    NextEntryOffset: DWORD;
    Action: DWORD;
    FileNameLength: DWORD;
    FileName: array [0..0] of WCHAR;
  end;

var
  hDir : THandle;
  Buf : pointer;
  Returned, BufSize : dword;
  adr : DWORD;
  fni : ^FILE_NOTIFY_INFORMATION absolute adr;
  s : string;
  ws : WideString;

const
  wcs = SizeOf(WideChar); // = 2
  FILE_LIST_DIRECTORY       = ($0001); // directory

begin
  hDir := CreateFile(PChar(Dir),
                     FILE_LIST_DIRECTORY,
                     FILE_SHARE_READ or FILE_SHARE_DELETE,
                     nil,
                     OPEN_EXISTING,
                     FILE_FLAG_BACKUP_SEMANTICS,
                     0);

  if hDir = INVALID_HANDLE_VALUE then Exit;

  BufSize := 16*1024*1024; // 16 метров - так навсякий пожарный :)
  GetMem(Buf, BufSize);

  repeat
    if ReadDirectoryChangesW(hDir, Buf, BufSize, SubDirs,
       FILE_NOTIFY_CHANGE_FILE_NAME or
       FILE_NOTIFY_CHANGE_DIR_NAME or
       FILE_NOTIFY_CHANGE_ATTRIBUTES or
       FILE_NOTIFY_CHANGE_SIZE or
       FILE_NOTIFY_CHANGE_LAST_WRITE or
       FILE_NOTIFY_CHANGE_LAST_ACCESS or
       FILE_NOTIFY_CHANGE_CREATION or
       FILE_NOTIFY_CHANGE_SECURITY, @Returned, nil, nil) then
    begin
      Adr := Cardinal(Buf);
      while Adr < (Cardinal(Buf) + Returned) do
      begin
        case fni^.Action of
          FILE_ACTION_ADDED            : s := 'Added';
          FILE_ACTION_REMOVED          : s := 'Removed';
          FILE_ACTION_MODIFIED         : s := 'Modified';
          FILE_ACTION_RENAMED_OLD_NAME : s := 'Renamed from';
          FILE_ACTION_RENAMED_NEW_NAME : s := 'Renamed to';
          else s := '0x' + IntToHex(fni^.Action, 8);
        end;
        SetLength(ws, fni^.FileNameLength div wcs);
        Move(fni^.FileName, ws[1], fni^.FileNameLength);
        EventLog := s + ' "' + ws + '"';
        Synchronize(AddEvent);
        Inc(adr, fni^.FileNameLength - wcs + SizeOf(fni^));
      end;
    end;
  until False;
  CloseHandle(hDir);
  FreeMem(Buf);
end;

end.
Человек_Борща вне форума Ответить с цитированием
Старый 19.05.2011, 13:55   #4
vbilash
 
Регистрация: 18.12.2009
Сообщений: 7
По умолчанию

спасибо большое...буду разбиратся! 2 суток уже сижу за компом и долблю делфи! как проклятый))))))
vbilash вне форума Ответить с цитированием
Старый 19.05.2011, 14:48   #5
vbilash
 
Регистрация: 18.12.2009
Сообщений: 7
Радость Оповищение об озменение в каталоге!

а возможно ли при изменении файла/каталога/директирии - выводить звуковое сопровождение, даже можно встроенный звук винды или на выбор загружать небольшую мелодию, что-бы не сидеть и не смотреть в монитор как обезьяна а просто услышал небольшой звуковой сигнал, зная что в указанной директории произошло изменение!! я думаю что то реально...но увы не в моих способностях!!!!
vbilash вне форума Ответить с цитированием
Старый 19.05.2011, 14:49   #6
vbilash
 
Регистрация: 18.12.2009
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Ну так очевидно, у Вас ошибка в 42 и 57 строчках исходного кода!
а поточнее можно)))) извинете за нахальство!)))
vbilash вне форума Ответить с цитированием
Старый 19.05.2011, 15:46   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Цитата:
Сообщение от vbilash Посмотреть сообщение
а возможно ли при изменении файла/каталога/директирии - выводить звуковое сопровождение, даже можно встроенный звук винды или на выбор загружать небольшую мелодию, что-бы не сидеть и не смотреть в монитор как обезьяна а просто услышал небольшой звуковой сигнал, зная что в указанной директории произошло изменение!! я думаю что то реально...но увы не в моих способностях!!!!
Ведь там где показываете что, что-то изменилось в папке(с указанием) можно ведь и воспроизведение звуков все там же прикрутить...

Про звуки написано тут
Человек_Борща вне форума Ответить с цитированием
Старый 19.05.2011, 19:37   #8
vbilash
 
Регистрация: 18.12.2009
Сообщений: 7
Радость

Подскажите пожалуйста!!! Когда я переименовую файл, то выскакивает ошибка - Процесс не может получить достук файлу, т.к. этот файл занят другим процессом???? что делать? плизззз!!!!!!!!!
vbilash вне форума Ответить с цитированием
Старый 19.05.2011, 19:50   #9
vbilash
 
Регистрация: 18.12.2009
Сообщений: 7
Хорошо Код - слежением за каталогом!

Просмотрите пожалуйста код!


___________________________________ ________________________________----------------------------------------------------------------------------
Код:
unit uMonThread;

interface

uses
  Classes, windows, SysUtils;

type

  TMonDirThread = class(TThread)
  private
    FPath: String;                    //Проверяемый каталог
  protected
    procedure Execute; override;
    procedure UpdateLog;              //Добавление записи в журнал.
    procedure ThreadStart;            //Старт потока
    procedure ThreadStop;             //Завершение потока
  public
    constructor Create(aPath: String);
  end;

implementation
uses
  ufMain;

constructor TMonDirThread.Create(aPath: String);
begin
  inherited Create(True);     //Созданный поток создается в приостановленном состоянии
  FreeOnTerminate := True;    //Поток освободит ресурсы при окончании работы
  FPath := aPath;           	//Проверяемый каталог
  Self.Priority := tpHighest; //Очень высокий приоритет
  Resume;
end;

procedure TMonDirThread.ThreadStart;
begin
  fMonDirMain.sbMain.Panels[1].Text := 'Активен';
  fMonDirMain.lbLog.Items.Add(TimeToStr(time)+': монитор запущен');
end;

procedure TMonDirThread.ThreadStop;
begin
  fMonDirMain.sbMain.Panels[1].Text := 'Отключен';
  fMonDirMain.lbLog.Items.Add(TimeToStr(time)+': монитор остановлен');
  fMonDirMain.mmStart.Enabled := True;    // Отключаем кнопку mmStart
  fMonDirMain.mmStop.Enabled := False;    // Включаем кнопку mmStop
end;

procedure TMonDirThread.UpdateLog;
begin
  fMonDirMain.lbLog.Items.Add(TimeToStr(time)+': изменение!');
  if fMonDirMain.lbLog.Items.Count > 200 then //Показываем только 200 записей
    fMonDirMain.lbLog.Items.Delete(0);
  fMonDirMain.lbLog.ItemIndex := fMonDirMain.lbLog.Items.Count-1;
end;

procedure TMonDirThread.Execute;
var
  HandleChange: THandle;  //Handle создаваемого объекта для ожидания события
begin
//-- Создаем объект для ожидания события
  HandleChange :=
    FindFirstChangeNotification(
      PChar(FPath),                           //Проверяемый каталог
      False,                                  //Подкаталоги не проверяются
      FILE_NOTIFY_CHANGE_FILE_NAME +          //Проверка создания/удаления/
      FILE_NOTIFY_CHANGE_ATTRIBUTES);         //переименования/изменения файлов

//-- При ошибке Win32Check выводит сообщение и прерывает Execute.
    Win32Check(HandleChange <> INVALID_HANDLE_VALUE);
      Synchronize(ThreadStart);               //Сообщение о старте потока
  try
//-- Цикл, пока для потока не будет выдана команда Terminate
    while not Terminated do
    begin
      case WaitForSingleObject(HandleChange,1000) of
        WAIT_FAILED: Terminate;                //Ошибка, завершаем поток
        WAIT_OBJECT_0: Synchronize(UpdateLog); //Сообщаем об изменении
      end;
      FindNextChangeNotification(HandleChange);
    end;
  finally
    FindCloseChangeNotification(HandleChange);
  end;
  Synchronize(ThreadStop);                     //Сообщаем о завершении потока
end;

end.
----------------------------------------------------------------------------
___________________________________ ________________________________




___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 20.05.2011 в 10:09.
vbilash вне форума Ответить с цитированием
Старый 19.05.2011, 22:30   #10
vbilash
 
Регистрация: 18.12.2009
Сообщений: 7
Радость

как в этом коде добавить имя файла или директории????
vbilash вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
поиск в каталоге (assembler) YaraF Помощь студентам 0 28.02.2011 17:15
Завис процесс notepad++.exe с несохранёнными изменениями war3x Помощь студентам 4 21.12.2009 01:44
Помогите с изменениями данных в программе на делфи зауч Помощь студентам 1 12.11.2009 17:49
как следить за программой slavbase Свободное общение 4 21.03.2009 19:44
Создать файл текущем каталоге tarakan1983 Помощь студентам 6 14.09.2008 21:59