unit win95;
{
Копирование, перемещение и удаление файлов и каталогов наподобие
Проводника (Explorer) в Windows 95.
Дата : 06/04/97
Последнее обновление: 03/08/97
Просьба сообщать о всех найденных ошибках и недочетах на мой
адрес электронной почты.
Приветствуются пожелания и предложения по улучшению функциональности!!!
ОБНОВЛЕНИЯ:
(18/04/97)
Множество небольших поправок после множества ваших писем.
Спасибо всем.
(31/08/97)
Две новых процедуры: Win95AddToRecent и
Win95ClearRecentDocs.
}interfaceuses Classes, ShellApi, ShlObj, Registry, Windows;
type
Str10 = string[10];
const
fpRootKey =
'\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders';
fpDesktop: Str10 = 'DESKTOP';
fpFavorites: Str10 = 'FAVORITES';
fpFonts: Str10 = 'FONTS';
fpPersonal: Str10 = 'PERSONAL';
fpPrograms: Str10 = 'PROGRAMS';
fpRecent: Str10 = 'RECENT';
fpSendTo: Str10 = 'SENDTO';
fpStartMenu: Str10 = 'START MENU';
fpStartup: Str10 = 'STARTUP';
fpTemplates: Str10 = 'TEMPLATES';
{Пути к системным папкам}function GetFolderPath(const FolderName: Str10): string;
{Функции для работы с файлами}procedure Win95AddToRecentDocs(const Filename: string);
procedure Win95ClearRecentDocs;
{Для манипулирования несколькими файлами разделите их имена символом "#0"}function Win95Copy(Owner: Integer; FromFile, ToFile: string; RenameOnCollision,
Confirm: boolean): Boolean;
function Win95Move(Owner: Integer; FromFile, ToFile: string; RenameOnCollision,
Confirm: boolean): Boolean;
{Если SendToRecycleBin = True, то файлы будут отправлены в Корзину (RecycleBin),
в противном случае они будут стерты}function Win95Erase(Owner: Integer; WichFiles: string; SendToRecycleBin,
Confirm: Boolean): Boolean;
implementationfunction GetFolderPath(const FolderName: Str10): string;
beginwith TRegistry.Create dotry
RootKey := HKEY_CURRENT_USER;
OpenKey(fpRootKey, False);
Result := ReadString(FolderName);
finally
Free;
end;
end;
procedure Win95AddToRecentDocs(const Filename: string);
begin
SHAddToRecentDocs(SHARD_PATH, @Filename[1]);
end;
procedure Win95ClearRecentDocs;
begin
SHAddToRecentDocs(SHARD_PATH, nil);
end;
function Win95Copy(Owner: Integer; FromFile, ToFile: string; RenameOnCollision,
Confirm: boolean): Boolean;
const
Aborted: Boolean = False;
var
Struct: TSHFileOpStructA;
beginwhile pos(';', FromFile) > 0 do
FromFile[pos(';', FromFile)] := #0;
while pos(';', ToFile) > 0 do
ToFile[pos(';', ToFile)] := #0;
FromFile := FromFile + #0#0;
ToFile := ToFile + #0#0;
with Struct dobegin
wnd := Owner;
wFunc := FO_Copy;
pFrom := PChar(FromFile);
pTo := PChar(ToFile);
fFlags := FOF_ALLOWUNDO or FOF_FILESONLY;
if RenameOnCollision then
fFLags := fFlags or FOF_RENAMEONCOLLISION;
ifnot Confirm then
fFLags := fFlags or FOF_NOCONFIRMATION;
fAnyOperationsAborted := Aborted;
hNameMappings := nil;
lpszProgressTitle := nil;
end;
result := (SHFileOperationA(Struct) = 0) and (not Aborted);
end;
function Win95Move(Owner: Integer; FromFile, ToFile: string; RenameOnCollision,
Confirm: boolean): Boolean;
const
Aborted: Boolean = False;
var
Struct: TSHFileOpStructA;
beginwhile pos(';', FromFile) > 0 do
FromFile[pos(';', FromFile)] := #0;
while pos(';', ToFile) > 0 do
ToFile[pos(';', ToFile)] := #0;
FromFile := FromFile + #0#0;
ToFile := ToFile + #0#0;
with Struct dobegin
wnd := Owner;
wFunc := FO_Move;
pFrom := PChar(FromFile);
pTo := PChar(ToFile);
fFlags := FOF_ALLOWUNDO or FOF_FILESONLY;
if RenameOnCollision then
fFLags := fFlags or FOF_RENAMEONCOLLISION;
if Confirm then
fFLags := fFlags or FOF_NOCONFIRMATION;
fAnyOperationsAborted := Aborted;
hNameMappings := nil;
lpszProgressTitle := nil;
end;
result := (SHFileOperationA(Struct) = 0) and (not Aborted);
end;
function Win95Erase(Owner: Integer; WichFiles: string; SendToRecycleBin,
Confirm: Boolean): Boolean;
const
Aborted: Boolean = False;
var
Struct: TSHFileOpStructA;
beginwhile pos(';', WichFiles) > 0 do
WichFiles[pos(';', WichFiles)] := #0;
WichFiles := WichFiles + #0#0;
with Struct dobegin
wnd := Owner;
wFunc := FO_Delete;
pFrom := PChar(WichFiles);
pTo := nil;
ifnot Confirm then
fFlags := FOF_NOCONFIRMATION;
if SendToRecycleBin then
fFLags := fFlags or FOF_ALLOWUNDO or FOF_FILESONLY
else
fFlags := fFlags or 0 or FOF_FILESONLY;
fAnyOperationsAborted := Aborted;
hNameMappings := nil;
lpszProgressTitle := nil;
end;
result := (SHFileOperationA(Struct) = 0) and (not Aborted);
end;
end.
Привет! Я переведу текст на русский язык:
Константы
Единица определяет несколько констант для различных имен папок, таких как fpRootKey, которое представляет собой ключ регистра для Windows Explorer (Win95).
Функции и процедуры
Единица предоставляет несколько функций и процедур для управления файлами и директориями:
GetFolderPath: Возвращает путь к системной папке, используя регистр.
Win95AddToRecentDocs: Добавляет файл в список最近 использованных документов с помощью функции SHAddToRecentDocs из Shell API.
Win95ClearRecentDocs: Очищает списокrecent documents с помощью той же функции.
Win95Copy: Копирует один или несколько файлов с помощью функции SHFileOperationA из Shell API.
Win95Move: Перемещает один или несколько файлов с помощью той же функции.
Win95Erase: Удаляет один или несколько файлов с помощью той же функции.
Имплементация
Секция реализации определяет несколько переменных и констант, используемых в функциях и процедурах:
Aborted: Булевая переменная, отслеживающая, была ли операция прервана.
Struct: Экземпляр записи TSHFileOpStructA, используемой для передачи параметров функции SHFileOperationA.
Секция реализации также определяет логику для каждой функции и процедуры. Например, в Win95Copy код:
1. Препроцессирует входные имена файлов, заменяв semicolons на null-значение (#0).
2. Создает экземпляр записи TSHFileOpStructA.
3. Устанавливает свойства структуры для указания операции (копирование), источника и целевого файла, а также других параметров.
4. Вызывает функцию SHFileOperationA с модифицированной структурой.
Замечания
Код написан на языке Delphi Pascal и использует Windows API и Shell API.
Единица предоставляет базовое реализацию для управления файлами и директориями, аналогичную Windows Explorer (Win95).
Код был обновлен несколько раз, но последнее обновление seems to be from 1997, поэтому он может не быть совместимым с современными версиями Windows или Delphi.
Рекомендации
Рассмотрите возможность обновления кода для использования современных функций и синтаксиса Delphi.
Добавьте более надежное обслуживание ошибок и отладку, чтобы улучшить надежность и производительность.
Рассмотрите использование более robust библиотеки управления файлами вместо зависимости от Shell API.
Управление каталогами и файлами в стиле Проводника Windows 95.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.