![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перемещение каталогов
sally © (2006-02-02 11:55:00)Можно ли перемещать каталоги, используя стандартные процедуры перемещения файлов DeviceIoControl
sally (2006-02-02 16:47:00) [1]>Игорь Шевченко
Не помогла и та структура.
Но если вдруг кому интересно, на 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 остантся открытым.
Fay (2006-02-02 16:09:00) [2]>> Вы MSDN открывали?
LOL 8))
Игорь Шевченко (2006-02-02 15:58:00) [3]sally (02.02.06 15:52) [16]
А по существу я целую ссылку на статью дал. С картинками.
sally (2006-02-02 15:52:00) [4]>Игорь Шевченко
А по существу можно? Вы MSDN открывали? Зайдите по этой ссылке, посмотрите и скажите, где я не прав?
Или THandle и HWND это не одно и тоже и в этом кроется проблема?
Игорь Шевченко (2006-02-02 15:43:00) [5]
> Я из MSDN взял...
Очень сильно сомневаюсь, что в MSDN написано:
> FileHandle: HWND;
sally (2006-02-02 15:41:00) [6]т.е. стандартными вещами нельзя переместиь что ли? Надо писать свой драйвер?
ZeroDivide (2006-02-02 15:39:00) [7]
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:35:00) [8]Да странно....
Я из MSDN взял...
Попробую с этим вариантом. Спасибо.
Нортон утилиты конечно класс, но нужно иметь возможность перемещать кластера в Win98.
Игорь Шевченко (2006-02-02 15:32:00) [9]
> Чем пользоваться какими процедурами для дефрагментации 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:23:00) [10]Чем пользоваться какими процедурами для дефрагментации Win98.
sally (2006-02-02 14:26:00) [11]параметр задан неверно ...
Игорь Шевченко (2006-02-02 14:22:00) [12]sally (02.02.06 14:18) [7]
А что говорят, когда не хотят ?
sally (2006-02-02 14:18:00) [13]>Игорь Шевченко
Трудно спорить, но если файлы(кластеры "под" файлом) перемещаются, то "директории" не хотят...
Игорь Шевченко (2006-02-02 14:14:00) [14]
> Можно ли перемещать каталоги, используя DeviceIoControl
Каталог - это тоже файл
sally (2006-02-02 14:11:00) [15]Да, а чем пльзуются для дефрагментации WIn98?
sally (2006-02-02 14:05:00) [16]вопрос то был:
Можно ли перемещать каталоги, используя DeviceIoControl
Он вроде как их не перемещает...
ZeroDivide (2006-02-02 13:25:00) [17]DeviceIoControl, FSCTL_MOVE_FILE используется только для дефрагментации и то только под w2k и выше :)
И перемещает собственно не файлы а кластеры
the granularity of the move is 16 clusters; otherwise, the granularity is one cluster
... и причем в пределах одного тома.
sally (2006-02-02 13:10:00) [18]ну как? очень даже просто...
Я их перемещаю не логически, а физически. Может я не корректно выразился.
А вообще-то
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 12:59:00) [19]Интересно, а как ты с помощью 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;