Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.05;
Скачать: CL | DM;

Вниз

Перемещение каталогов   Найти похожие ветки 

 
sally   (2006-02-02 11:55) [0]

Можно ли перемещать каталоги, используя стандартные процедуры перемещения файлов DeviceIoControl


 
ZeroDivide ©   (2006-02-02 12:59) [1]

Интересно, а как ты с помощью DeviceIoControl перемещаешь файлы?

Можно ли перемещать каталоги, используя стандартные процедуры
Вполне стандартно использовать для этого ShellAPI

procedure CopyFiles(const FromFolder: string; const ToFolder: string);
var
 Fo      : TSHFileOpStruct;
 buffer  : array[0..4096] of char;
 p       : pchar;
begin
 FillChar(Buffer, sizeof(Buffer), #0);
 p := @buffer;
 StrECopy(p, PChar(FromFolder)); //директория, которую мы хотим скопировать
 FillChar(Fo, sizeof(Fo), #0);
 Fo.Wnd    := Application.Handle;
 Fo.wFunc  := FO_COPY;
 Fo.pFrom  := @Buffer;
 Fo.pTo    := PChar(ToFolder); //куда будет скопирована директория
 Fo.fFlags := 0;
 if ((SHFileOperation(Fo) <> 0) or (Fo.fAnyOperationsAborted <> false)) then
   ShowMessage("File copy process cancelled")
end;


 
sally   (2006-02-02 13:10) [2]

ну как? очень даже просто...
Я их перемещаю не логически, а физически. Может я не корректно выразился.
А вообще-то
DeviceIoControl(DiskHandle, FSCTL_MOVE_FILE, @MoveParams,            sizeof(MoveParams), nil, 0, w, nil);

ну соответственно

MOVE_FILE_DATA = record
   FileHandle: HWND;
   StartingVcn: LONGLONG;
   StartingLcn: LONGLONG;
   ClusterCount: DWORD;
 end;
MoveParams: MOVE_FILE_DATA;

ShellAPI перемещает файлы логически...


 
ZeroDivide ©   (2006-02-02 13:25) [3]

DeviceIoControl, FSCTL_MOVE_FILE используется только для дефрагментации и то только под w2k и выше :)

И перемещает собственно не файлы а кластеры
the granularity of the move is 16 clusters; otherwise, the granularity is one cluster

... и причем в пределах одного тома.


 
sally   (2006-02-02 14:05) [4]

вопрос то был:
Можно ли перемещать каталоги, используя DeviceIoControl

Он вроде как их не перемещает...


 
sally   (2006-02-02 14:11) [5]

Да, а чем пльзуются для дефрагментации WIn98?


 
Игорь Шевченко ©   (2006-02-02 14:14) [6]


> Можно ли перемещать каталоги, используя DeviceIoControl


Каталог - это тоже файл


 
sally   (2006-02-02 14:18) [7]

>Игорь Шевченко
Трудно спорить, но если файлы(кластеры "под" файлом) перемещаются, то "директории" не хотят...


 
Игорь Шевченко ©   (2006-02-02 14:22) [8]

sally   (02.02.06 14:18) [7]

А что говорят, когда не хотят ?


 
sally   (2006-02-02 14:26) [9]

параметр задан неверно ...


 
sally   (2006-02-02 15:23) [10]

Чем пользоваться какими процедурами для дефрагментации Win98.


 
Игорь Шевченко ©   (2006-02-02 15:32) [11]


> Чем пользоваться какими процедурами для дефрагментации Win98.


Norton Utilities ?


> MOVE_FILE_DATA = record
>    FileHandle: HWND;
>    StartingVcn: LONGLONG;
>    StartingLcn: LONGLONG;
>    ClusterCount: DWORD;
>  end;
> MoveParams: MOVE_FILE_DATA;


А вот на SysInternals

http://www.sysinternals.com/Information/DiskDefragmenting.html

почему-то другое определение

typedef struct {
   HANDLE FileHandle;
   ULONG Reserved;
   LARGE_INTEGER StartVcn;
   LARGE_INTEGER TargetLcn;
   ULONG NumVcns;
   ULONG Reserved1;
} MOVEFILE_DESCRIPTOR, *PMOVEFILE_DESCRIPTOR;

Может ты параметр неверный передаешь ?


 
sally   (2006-02-02 15:35) [12]

Да странно....
Я из MSDN взял...
Попробую с этим вариантом. Спасибо.

Нортон  утилиты конечно класс, но нужно иметь возможность перемещать кластера в Win98.


 
ZeroDivide ©   (2006-02-02 15:39) [13]


FSCTL_MOVE_FILE
...
Requires Windows Vista, Windows XP, or Windows 2000 Professional.

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/fsctl_move_file.asp


 
sally   (2006-02-02 15:41) [14]

т.е. стандартными вещами нельзя переместиь что ли? Надо писать свой драйвер?


 
Игорь Шевченко ©   (2006-02-02 15:43) [15]


> Я из MSDN взял...


Очень сильно сомневаюсь, что в MSDN написано:


> FileHandle: HWND;


 
sally   (2006-02-02 15:52) [16]

>Игорь Шевченко
А по существу можно? Вы MSDN открывали? Зайдите по этой ссылке, посмотрите и скажите, где я не прав?
Или THandle и HWND это не одно и тоже и в этом кроется проблема?


 
Игорь Шевченко ©   (2006-02-02 15:58) [17]

sally   (02.02.06 15:52) [16]

А по существу я целую ссылку на статью дал. С картинками.


 
Fay ©   (2006-02-02 16:09) [18]

>> Вы MSDN открывали?
LOL 8))


 
sally   (2006-02-02 16:47) [19]

>Игорь Шевченко
Не помогла и та структура.

Но если вдруг кому интересно, на http://www.sysinternals.com/Information/DiskDefragmenting.html написано, что
because of the way the FSCTL_MOVE_FILE routine is written, it is only possible to reallocate file data clusters, and not directories or other file metadata

В MSDN ничего об этом нет.

Так что директории(кластера под директориями) переместить не удасться.

Вопрос о перемещении кластеров под Win98 остантся открытым.



Страницы: 1 вся ветка

Текущий архив: 2006.03.05;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.031 c
1-1138703043
API
2006-01-31 13:24
2006.03.05
Эффект сворачивания окна (анимация)


2-1140188665
KyRo
2006-02-17 18:04
2006.03.05
TStringList


15-1139494192
ZeroDivide
2006-02-09 17:09
2006.03.05
Лена Воронова отдыхает...


15-1139750938
Интересующийся
2006-02-12 16:28
2006.03.05
Ограничение числа подключений к компу в реестре


2-1140312344
us es
2006-02-19 04:25
2006.03.05
Юнит ваще без uses - хорошо, или нужно что-то добавить?