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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.10.2010, 18:26   #1
wm_leviathan
Форумчанин
 
Аватар для wm_leviathan
 
Регистрация: 17.02.2010
Сообщений: 399
По умолчанию получить "чистое" имя файла

Доброго вермени суток. суть такова имеется папка с архивами необходимо следить за ней и как только в ней появился новый архив, то скопировать его в другую папку. слежу за папкой так:
Код:
procedure TThreadMonFile.MonFile;
const  Filter =
  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;
var
  Dir: THandle;
  Notify: TFileNotifyInformation;
  BytesReturned: DWORD;
  Source: string;
begin
  Source:= mainform.Source+ '\';
  Dir := CreateFile(PChar(Source), 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
      if Notify.Action = FILE_ACTION_ADDED then begin
      form1.Memo1.Lines.Add('Имеется новый архив: ' + Notify.FileName);


 NewF:=  Notify.FileName;
      end;

  finally
    CloseHandle(Dir);
  end;
end;
переменная NewF (глобалка) типа strin а вот Notify.FileName типа array of WideChar и возвращает мне несовсем точное имя. К примеру я скопировал в "наблюдаемую" папку новый архив New.rar, тогда переменной NewF присвоится имя "New.rar??????????#3"(типа того) что не совсем правильно. как сделать так чтоб оно возвращало нормальное имя файла "New.rar" ?
wm_leviathan вне форума Ответить с цитированием
Старый 18.10.2010, 20:15   #2
SERG1980
Участник клуба
 
Аватар для SERG1980
 
Регистрация: 28.03.2007
Сообщений: 1,814
По умолчанию

Мне в своё время Stilet подкинул хороший юнит для слежки за файлами
Вложения
Тип файла: rar Примеры.rar (7.2 Кб, 44 просмотров)
SERG1980 вне форума Ответить с цитированием
Старый 18.10.2010, 23:17   #3
wm_leviathan
Форумчанин
 
Аватар для wm_leviathan
 
Регистрация: 17.02.2010
Сообщений: 399
По умолчанию

SERG1980 огромное спасибо за пример.(кстати там есть чему поучиться+очень приятно что работает со вложенными папками) но... вопрос был нмножко другой "как сделать так чтобы notifity.filename возвращало "читое имя" а не имя + каракули. вот полный листинг модуля:
Код:
unit ThreadMonFile;

interface

uses
  Classes,Windows,Messages, SysUtils, Variants, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;

type
  TThreadMonFile = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
    procedure MonFile;
    function ApplicationUse(fName: string): boolean;
  end;

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

end;

var
NewF: string;

implementation
uses MainForm,Thread1;
{ TThreadMonFile }


procedure TThreadMonFile.Execute;
begin
  { Place thread code here }
MonFile;
end;

procedure TThreadMonFile.MonFile;
const  Filter =
  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;
var
  Dir: THandle;
  Notify: TFileNotifyInformation;
  BytesReturned: DWORD;
  Source: string;
begin
  Source:= mainform.Source+ '\';
  Dir := CreateFile(PChar(Source), 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
      
      if Notify.Action = FILE_ACTION_ADDED then begin
      form1.Memo1.Lines.Add('Имеется новый архив: ' + Notify.FileName);


     NewF:=  Notify.FileName;//к примеру если файл open.bmp То будет open.bmp????????#3 что в дальнейшем не даст работать с файлом.
      end;

  finally
    CloseHandle(Dir);
  end;
Form1.Memo1.Lines.Add('Копирование начато: ' + DateToStr(Now)+' : '+TimeToStr(Now));
TThreadCopy.Create(False);
end;
end.
это модуль потока т.к. скажем так "наблюдение" за папкой происходит у меня в отдельном потоке.
wm_leviathan вне форума Ответить с цитированием
Старый 19.10.2010, 08:58   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
а не имя + каракули.
Я ты очищай массив FileName перед использованием ReadDirectoryChangesW
например функцией FillChar. передавая ей #0
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.10.2010, 14:56   #5
wm_leviathan
Форумчанин
 
Аватар для wm_leviathan
 
Регистрация: 17.02.2010
Сообщений: 399
По умолчанию

Если честно не понял как работает функция FillChar заполняет пустые значения ? если бы вы показали было бы неплохо.
ЗЫ решение сделал по старинке:
Код:
NewF:='';
      i:=0;
      k := Notify.FileNameLength;
  while i<=k/2-1 do begin
     NewF:= NewF + Notify.FileName[i];
     i := i+1;
  end;

Последний раз редактировалось wm_leviathan; 19.10.2010 в 15:50.
wm_leviathan вне форума Ответить с цитированием
Старый 19.10.2010, 15:07   #6
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

FillChar - http://www.delphisources.ru/pages/fa...lChar.php.html
Заполнять символом пробела
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 19.10.2010 в 15:09.
Utkin вне форума Ответить с цитированием
Старый 19.10.2010, 15:54   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Заполнять символом пробела
Я б лучше #0-м заполнял... Он всетки терминатор принятой ASCIIZ строки в Винде...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.10.2010, 15:58   #8
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Ну в общем можно и так. Но есть один момент. Все эти нули, кроме последнего останутся недоступными, если конечно их специально не шебуршить . Короче, чревато утечками памяти...
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 19.10.2010, 16:34   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А я вот не помню менеджер памяти Делфи следит за освобождением локальных образмеренных или финализированных переменных?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.10.2010, 17:03   #10
wm_leviathan
Форумчанин
 
Аватар для wm_leviathan
 
Регистрация: 17.02.2010
Сообщений: 399
По умолчанию

по умолчанию Notify.FileName возвращал мне (к примеру файл open.bat) open.bat#0#0#0#0#0#0#0#0#0#0#0#0#0# 0#0#0#0#0#0#0
и присваивалось переменной именно такое имя что в дальнейшем не даст использовать в какой нить функции. поэтому мне надо было убрать мусор типа #0 или #3.
wm_leviathan вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как написать "составное" имя файла на с++ archer*ow Помощь студентам 1 01.03.2010 12:48
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04
Считывание строк из файла. перемещение по строкам "веред"-"назад" Larkin. Помощь студентам 2 15.06.2009 17:58
PHP(или другой язык): Получить все пары "имя" -> "значение" переданные методом POST KingOfNothing PHP 4 12.04.2009 14:06