Просмотр и упорядочение файлов и папок. Импорт и экспорт файлов различных форматов в Pages

Введение

В статье я подробно расскажу, как ассоциировать собственное приложение с определенным типом файлов. Чтобы при двойном клике по файлу запускалось это приложение и открывало выбранный файл.

Для ассоциации файлов с приложением есть специальные компоненты и модули, например . В статье я буду описывать, как это делается вручную.

Как все это работает?

Вообще все работает очень просто. Вся необходимая для этого информация заносится в реестр в определенную ветку. Откройте редактор реестра (Пуск -> Выполнить -> regedit) и зайдите в ветку HKEY_CLASSES_ROOT. Там Вы увидите все существующие в системе расширения. Там вы найдете и.txt и.bmp и многие другие знакомые расширения.

Давайте рассмотрим расширение.jpg. В нем у меня есть ветка OpenWithProgids, а в ней есть ACDSee Pro 2.0.jpg типа REG_SZ. Дальше переходим по ветке HKEY_CLASSES_ROOT\ACDSee Pro 2.0.jpg. В ней есть несколько веток. Рассмотрим те, которые нам понадобятся, это: DefaultIcon - путь к иконке которой будет отображаться файл в проводнике; shell\Open\command - какую программу открывать при двойном клике по файлу.

Необходимо знать, что при запуске программы в качестве параметра передается путь к файлу, который открывается. Поэтому нужно будет обрабатывать этот параметр.

Реализация

Пусть файл будет расширения .dev . Напишем процедуру для добавления необходимых значений в реестр. Не забудьте добавить в секцию uses модуль Registry для работы с реестром.

uses Registry, ShlObj;
...
var Reg: TRegistry;
...
procedure Associate;
var s:string ;
begin
Reg:=TRegistry.Create; // создаем
// указываем корневую ветку

Reg.OpenKey(".dev\OpenWithProgids\" , true);
Reg.WriteString("TestApplication.dev" , "");

Reg.OpenKey("\TestApplication.dev\DefaultIcon\" , true);
s:=Application.ExeName+",0";
Reg.WriteString("", s);

Reg.OpenKey("\TestApplication.dev\Shell\Open\" , true);
Reg.WriteString("", "Открыть в TestApplication");

Reg.OpenKey("command\" , true);
s:="""+Application.ExeName+"" "%1"";
Reg.WriteString("", s);

nil , nil );
end ;

Функция OpenKey открывает ветку, указанную в первом параметре. Второй параметр установлен в True, чтобы ветвь создалась, если она не существует.

Далее в переменной s формируем путь к иконке. В данном случае берется иконка с индексом 0 из exe приложения. Например, можно добавить в приложение еще одну иконку и использовать её для файлов программы, но можно указать и путь к.ico файлу.

TestApplication.dev я выбрал сам. Название этой ветки придумываете вы сами. Обычно пишется название программы и добавляется расширение, так как программа может работать с несколькими расширениями.

После добавления данных в реестр вызывается процедура SHChangeNotify , чтобы иконки обновились и настройки применились.

procedure DeleteAssociate;
begin
Reg:=TRegistry.Create;
Reg.RootKey:= HKEY_CLASSES_ROOT;

Reg.DeleteKey(".dev" );
reg.DeleteKey("TestApplication.dev" );

SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil , nil );
end ;

Тут все еще проще - просто удаляем созданные ветки.

Обработка загрузки

Теперь осталось только обработать параметр, чтобы программа не просто загружалась, а еще и открывала файл. Все очень просто, во время создания формы считываем функцией ParamCount количество параметров и если их число не 0, то вызываем функцию загрузки, а в качестве входного параметра в эту функцию передаем путь к файлу, который нужно открыть. Щелкните по форме два раза, тем самым создавая, обработчик создания формы.

procedure TForm1.FormCreate(Sender: TObject);
begin
if ParamCount <> 0 then Load(ParamStr(1));
end ;

Ну и нужно еще написать функцию загрузки файла. Добавьте TMemo на форму.

function Load(FName:string ): boolean;
begin
Form1.Memo1.Lines.LoadFromFile(FName);
end ;

Скорее всего, в вашем приложении функция будет значительно сложнее с обработкой на невозможность открытия файла и возвратом результата открытия. В данном случае я не буду это делать.

Добавьте два TButton на форму. По клику по первому будет выполняться ассоциация, а по второму снятие ассоциации.

Кликаем два раза по первой кнопке и приводим процедуру к такому виду.

procedure TForm1.Button1Click(Sender: TObject);
begin
Associate;
end ;

Выполняем действия аналогичные описанным выше, но для второй кнопки.

procedure TForm1.Button2Click(Sender: TObject);
begin
DeleteAssociate;
end ;

Ну вот и все. При попытке открытия файла с расширением.dev в Memo1 должно загрузиться содержимое файла.

Требования.
Для выполнения указанных в этой статье действий, необходимо на компьютере иметь права локального администратора.
Статья действительная для Windows 98/Me/2000/XP/Vista.

Информация.
Первый случай.
Бывает что после установки новой программы, некоторые файлы начинают открываться именно в это программе. Например, всю жизнь Вы смотрите кино с помощью WinAmp и однажды решили установить новые кодеки, а установка этих кодеков предусматривала установку проигрывателя Windows Media Classic . И теперь файлы с расширением .avi , открываются в новом проигрывателе, но Вам же хочется смотреть с помощью WinAmp , поэтому сделаем небольшие настройки.

Второй случай.
После удаления программы, некоторые файлы перестают открываться вообще. Такое случается если за этим типом файлов, нет закрепленной программы. Поэтому нужно вручную определить какой программой нужно открывать этот тип файлов.

Закрепление типа файла за программой.
1. Щелкните правой кнопкой мыши на файле;
2. Выберите пункт меню "Свойства ";
3. В окне "Свойства", переходим на вкладку "Общие ";
4. В пункте "Приложение ", будет отображено с помощью какой программы открывается этот файл (в наше случаи это "Windows Media Classic ");
5. Нажимаем кнопку "Изменить ";
6. В окне "Выбор программы", найдите и щелкните по необходимой программе (а нашем случаи это "WinAmp ");
7. Поставьте галочку "Использовать выбранную программу для всех файлов такого типа ", если она не установлена;


8. Нажмите кнопку "ОК";

Теперь файлы с расширением .avi , будут открываться с помощью WinAmp .

Иногда начинающие пользователи спрашивают, как можно сделать так, чтобы файл всегда открывался в определенной программе. Допустим, вы установили новый просмотрщик изображений, но при двойном клике по картинке, Windows по-прежнему открывает его в стандартной утилите для просмотра изображений.

Почему так происходит и как вообще Windows определяет, каким приложением открывать тот или иной файл? Такое “понимание” стало возможным благодаря так называемому связыванию или . В сущности, ассоциация файлов является ничем иным как привязкой файла к прикладной программе по каким-то определенным признакам, чаще всего по расширению.





Некоторые программы при установке автоматически изменяют ассоциацию файлов, внося соответствующие изменения в реестр, а заодно прописывают себя в контекстном меню Проводника, другие же делают что-то одно или вообще не вносят никаких изменений. В последнем случае вы можете настроить ассоциацию самостоятельно.

В Windows 7 и 8 перейдите на Панель Управления и найдите там раздел “Программы по умолчанию”. В открывшемся окне вы увидите четыре пункта. Кликните по первому из них “Задание программ по умолчанию”. После непродолжительного сканирования системная утилита выведет список установленных на компьютере пользовательских приложений.





Допустим вам необходимо, чтобы файлы с расширением PNG всегда открывались в редакторе . В левой панели выделяем этот редактор мышкой, а затем жмем “Выбрать значения по умолчанию для этой программы”. В открывшемся окне отметьте галочкой нужное расширение, сохраните результат и отныне все изображения с расширением PNG при двойном клике по ним будут открываться именно в Paint.

Надо сказать, этот способ имеет определенные ограничения. Дело в том, что далеко не все установленные программы могут отображаться в этом списке. В таком случае вы можете пойти от противного, то есть не расширение “подгонять” под программу, а наоборот.





В разделе программ по умолчанию выберите второй пункт “Сопоставление типов файлов или протоколов с конкретными программами”. На этот раз служебной утилитой будет выведен список наиболее часто используемых расширений с кратким описанием и привязанным к ним приложениям. Поступаем аналогично. Представим такую ситуацию.

Перед нами поставлена задача - настроить ассоциации таким образом, чтобы файлы сценариев (.bat) можно было просматривать в обычном текстовом редакторе. Находим расширение BAT, выделяем его и в верхней части окна жмем кнопку “Изменить программу”.





В откроется окошко, в котором вам будет предложено выбрать нужное приложение, в Windows 8 первым предложением будет поискать приложение в Магазине (неопознанное расширение) или продолжать использовать связанную программу. Чтобы просмотреть полный список приложений нажмите “Дополнительно” и выберите нужное приложение. Если же его нет в списке, можете указать путь к исполняемому файлу самостоятельно через стандартный обзор.

Вывод

Настраивая ассоциации файлов можно автоматизировать задачи запуска разных типов файлов тем самым сделав свою работу на компьютере более продуктивной и быстрой.

Есть и другие способы настроить ассоциацию файлов. Например, опытные пользователи могут вносить соответствующие изменения в системный реестр. Вышеописанный же способ есть самый простой и удобный.

Кстати, настроить ассоциации можно не прибегая к инструментам Панели управления. Достаточно лишь кликнуть по спорному файлу правой клавишей мыши, выбрать “Свойства” и в открывшемся опциональном окошке указать необходимое для открытия файла приложение.

Когда вы скачиваете файлы из сети Интернет, операционная система помечает их особым образом из соображений безопасности. Позднее, когда вы пытаетесь открыть скачанный файл, Windows отображает предупреждение, что файл небезопасен и требует явного подверждения, что вы действительно намерены его открыть. Когда включена функция Smart Screen, некоторые файлы блокируются особенно упорно. Существует способ снять подобные блокировки со всех файлов и папок, находящих в каталоге "Загрузки" или в любой другой папке.
В самом механизме блокировки . Он работает с использованием уже знакомых нам . Для каждого скачанного файла дописывается альтернативный поток данных, параметры в котором и говорят операционной системе, что его получен из всемирной паутины и может быть небезопасен.

Чтобы в этом убедиться, в Windows 10 мы можем воспользоваться инструментом PowerShell. Выполним для одного из скачанных файлов вот такую команду:

Get-item имя_файла -stream *

Самый простой способ открыть PowerShell сразу в нужной папке - это воспользоваться командой-меню Файл в Проводнике Windows 10. Перейдите в папку "Загрузки" и выполните Файл - Запустить Windows Powershell - Запустить Windows Powershell:


Выполним вышеупомянутую команду для файла "winaerotweaker.zip". Это архив с моей же программой Winaero Tweaker, который я специально скачал для примера. Выполняем команду:

Get-item winaerotweaker.zip -stream *


Аргумент "-stream *" указывает команде get-item отобразить все имеющиеся потоки для файла. Zone.Identifier - это как раз и есть альтернативный поток данных, по которому Windows 10 определяет скачанный из Интернет файл. С помощью команды get-content мы можем посмотреть, что в него записано:

Get-content winaerotweaker.zip -stream Zone.Identifier


По своей сути - это обычный ini-файл, в котором определяющее значение имеет параметр ZoneId:

ZoneId=3

Его возможные значения:
0 - Файл создан на локальном компьютере.
1 - Файл получен по локальной сети
2 - Файл получен из доверенной зоны Интернет
3 - Файл получен из Интернет
4 - Файл получен из зоны "опасных сайтов"

Соответственно, чтобы разблокировать его, нужно либо записать 0 в ZoneId, либо вообще удалить альтернативный поток с именем Zone.Identifier.

Средствами графического интерфейса разблокировать файл можно через его свойства. Там есть соответствующий флажок (который в русской версии не совсем вписывается в диалоговое окно):

Как разблокировать сразу все файлы в папке Загрузки в Windows 10

Если нужно разблокировать много файлов или сразу все, открывать свойства каждого из них - очень утомительное занятие. К счастью, эту операцию можно упростить опять-таки при помощи PowerShell. Достаточно выполнить команду:

Dir -Recurse | Unblock-File

Её, естественно, нужно выполнить в нужной папке. В нашем случае PowerShell уже открыт в папке "Загрузки". Давайте выполним её и посмотрим, что из этого выйдет.

Команда отрабатывает без какого-либо вывода. Проверим альтернативные потоки данных:


То есть, команда Unblock-File просто удаляет поток Zone.Identifier у каждого из файлов:


Готово! Теперь, когда вам будет нужно разблокировать сразу несколько файлов в какой-либо папке на вашем компьютере, вы знаете, что делать. Кроме того, этот же трюк должен работать и в Windows 8/8.1, но проверить это в настоящий момент я не могу.

В язык Паскаль выделяются данные файлового типа, которые служат для работы с информацией, расположенной на внешних устройствах. Эта информация формируется во внешней памяти компьютера, образуя некоторую область, называемую файлом. Файлы имеют имя и представляют собой совокупность однотипных элементов. Обычно они применяются, в случаях большого объема данных, долгосрочного хранения, либо необходимости предоставления доступа нескольким приложениям к одной и той же информации.

Файлы принято разделять на физические и логические. Физические файлы имеют имя, и располагаются на съемном носителе, а логические это те переменные файлового типа, которые их представляют в программе.

В Паскале различают следующие три вида файлов (в скобках описаны ключевые слова для инициализации файловой переменной):

  • текстовые файлы (text);
  • типизированные (file of <тип>);
  • бестиповые (file).

Немного позже мы разберемся с каждым из них. А сейчас рассмотрим основные операции для работы с файлами.

Создание файла

Assign(<имя файловой переменной>, <имя файла>)

Процедура Assign связывает переменную файлового типа с физическим файлом. Например, установить соответствие между переменной Fil и текстовым файлом lot, расположенном на диске D, можно так:

Assign(Fil, ‘D:\lot.txt’)

Режим чтения

Reset(<имя файловой переменной>)

Процедура Reset открывает файл в режиме чтения, после чего операторомRead(<файловая переменная>, <считываемый элемент>) можно осуществить последовательное считывание элементов в программу.

Конец файла

ЕOF(<имя файловой переменной>)

Количество элементов в файле заранее не определяется, но часто необходимо знать о моменте достижения конца файла. Для этого в Паскале существует логическая функция EOF, которая проверяет достигнут ли конец, и если это так, то принимает значение True, иначе – False. Осуществляется проверка, как правило, в цикле, в качестве условного выражения выступает функция EOF.

Режим записи

Rewrite(<имя файловой переменной>)

Открыв файл в режиме записи, можно поэлементно записать в него информацию, воспользовавшись процедурой Write(<файловая переменная>, <элемент>).

Закрытие файла

Close(<имя файловой переменной>)

Процедура Close закрывает открытый файл, а также освобождает файловую переменную, указанную в качестве параметра.

Удаление файла

Erase(<имя файловой переменной>)

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

Изменение имени файла

Rеnаmе(<имя файловой переменной>, ‘<новое имя файла>’)

Rеnаmе переименовывает физический файл, который перед этим следует закрыть процедурой Close.

Смещение указателя файла

Sееk(<имя файловой переменной>, <номер элемента>)

Процедура Sееk устанавливает позицию указателя в файле на необходимый элемент (нумерация элементов начинается с нуля).

Определение положения указателя

FilePos(<имя файловой переменной>)

Функция FilePos принимает значение порядкового номера элемента, над которым в момент вызова находиться указатель.

Определение количества элементов

FileSize(<имя файловой переменной>)

Функция FileSize определяет количество всех имеющихся в файле элементов.

Текстовые файлы

Текстовые файлы могут состоять из элементов символьного (char) и строкового (string) типа данных. Ключевое слово Text указывает, что файловая переменная создается для работы именно с текстовым файлом:

Var <идентификатор>: Text;

Структура текстового файла представляет собой последовательность строк, которые в свою очередь состоят из символов. Любая строка оканчивается признаком «конца строки», а сам файл признаком «конца файла». Для определения конца файла в Паскаль есть функция EOF, а для конца строки –EOLn:

EOLn(<имя файловой переменной>)

В случае достижения конца строки она (функция EOLn) принимает значение True, в противном случае False.

Примеры задач на работу с файлами в Pascal:

1.Создать файл X компонентами которого являются элемента массива M. Переписать из файла X в файл Y все компоненты, которые стоят на четных местах. Прочитать файл Y.
M = (0,1; 5,6; 0.8; 2,4; 7,3; 6,8; 0,5; 2,3;)

const M: array of real = (0.1, 5.6, 0.8, 2.4, 7.3, 6.8, 0.5, 2.3);
var
x,y: file of real;

n: real; i: byte;
begin
assign(x,"x.dat");
assign(y,"y.dat");
rewrite(x);
for i:=1 to 8 do
write(x, M[i]);
close(x);
reset(x);
rewrite(y);
i:= 1;
while not EOF(x) do begin
read(x, n);
if not odd(i) then
write(y, n);
i:= i + 1;
end;
close(x); close(y);
reset(y);
while not EOF(y) do begin
read(y, n);
write(n:5:1);
end;
writeln;
close(y);
end.

2. Дан файл, в котором через пробел записаны натуральные числа. Вывести на экран суммы цифр каждого числа.

var
f: file of char;
c: char; sum, n: word;

begin
assign(f,"nums.txt");
reset(f);
sum:= 0;
while not eof(f) do begin
read(f,c);

if c <> " " then begin
val(c, n);
sum:= sum + n;
end
else begin
write(sum:5);
sum:= 0
end;
end;

writeln;
end.

3. Дан файл с учебным расписанием. Написать программу, которая определяет количество лекционных, практических и лабораторных занятий. Вывести их количество на экран.

var
f: text;
s: string;
i, lect, pract, lab: byte;
begin
assign(f,"lessons.txt");
reset(f);
lect:= 0;
pract:= 0;
lab:= 0;
while not Eof(f) do begin
readln(f,s);
i:= pos("лекц.",s);
if i <> 0 then lect:= lect + 1
else begin
i:= pos("практ.",s);
if i <> 0 then pract:= pract + 1
else begin
i:= pos("лаб.",s);
if i <> 0 then lab:= lab + 1
end;
end;
end;
close(f);
writeln("Лекций: ", lect);
writeln("Практических: ", pract);
writeln("Лабораторных: ", lab);
end.

4. Дана текстовая строка, состоящая из заглавных латинских букв. Требуется найти подстроку из трёх букв, которая встречается в данной строке чаще всего. Например, в строке DEFDEFABCABCZABCDEFDEF чаще всего (4 раза) встречается подстрока DEF. Входной файл содержит текстовую строку. Выходной файл должен содержать единственное число - количество вхождений самой часто встречающейся подстроки из трёх букв. Длина исходной строки от 3 до 1000000 символов.

var
t1, t2: text;
n, i, j, k: integer;
s, s1, s2: string;
begin
Assign(t1, "D:\Users\Пользователь\Desktop\1.txt");
Assign(t2, "D:\Users\Пользователь\Desktop\2.txt");
reset(t1);
rewrite(t2);
read(t1, s);
k:= 0;
for i:= 1 to length(S) - 2 do
begin
s1:= copy(s, i, 3);
for j:= 1 to length(s) - 2 do
begin
s2:= copy(s, j, 3);
if s2 = s1 then inc(k);;
end;
if k > n then n:= k;
k:= 0;
end;
write(t2, n);
close(t1);
close(t2);
end.

f: file of char;
fname: string;
ch: char;
n, line, w: word;
flag: boolean;
begin
write("File address&name: ");
readln(fname);
assign(f, fname);
reset(f);
n:= 0; line:= 0; w:= 0; flag:= false;
while not EOF(f) do begin
read(f, ch);
if ord(ch) = 13 then begin
read(f, ch);
line:= line + 1;
flag:= false;
end
else begin
n:= n + 1;
if ch = " " then flag:= false
else
if flag = false then begin
w:= w+1;
flag:= true;
end;
end;
end;
if n <> 0 then line:= line + 1;
writeln(n);
writeln(line);
writeln(w);
readln;
end.

var
f_in: text;
f_out: file;
name_in, name_out: string;
buffer: array of integer;
i,k: integer;
begin
{$I-}
write("Входной файл: ");readln(name_in);
assign(f_in,name_in);
reset(f_in);
if IOResult <> 0 then begin
writeln ("Файл не найден!");
exit
end;
write("Выходной файл: ");readln(name_out);
assign(f_out,name_out);
rewrite(f_out,sizeof(integer)*8);
{$I+}
i:= 0;
while not eof(f_in) do begin
inc(i);
read(f_in,buffer[i]);
if i = 8 then begin
blockwrite(f_out,buffer,1);
i:= 0
end;
end;
if i <> 0 then begin
for k:=i+1 to 8 do buffer[k] := 0;
blockwrite(f_out,buffer,1);
end;
close(f_in);
close(f_out);
readln
end.

7. В текстовом файле содержатся сведения о количестве учащихся в классах и их классных руководителях. Количество классов в школе не превышает 20. Для описания каждого класса отводится одна строка. В первых четырех позициях каждой строки файла записано имя класса (например, 5a, 10b) класса (не пишите русских букв), а затем количество человек в нем и ФИО руководителя. Программа по запросу выдает сведения о классе или сообщение о том, что класс не найден.

const n = 20;
type
str4 = string;
clas = record
title: str4;
pupils: byte;
teacher: string;
end;
var
school: array of clas;
i,j,len: integer;
title_search: str4;
found: boolean;
f: text;
begin
assign(f,"c:/school.txt"); reset(f);
i:= 1;
while not Eof(f) do begin
with school[i] do
readln(f,title,pupils,teacher);
i:= i + 1;
end;
while true do begin
write("Input class: ");
readln(title_search);
len:= length(title_search);
if len = 0 then break;
for j:= len + 1 to 4 do
title_search:= title_search + " ";
found:= false;
for j:= 1 to i - 1 do begin
if title_search <> school[j].title then continue;
with school[j] do
writeln(title:5,pupils:5,teacher:25);
found:= true;
break;
end;
if not found then
writeln("No class!");
end;
end.

8.Найти в строке все заданные последовательности символов и заменить их другой последовательностью.

var
s_out, s_in, str: string;
f: text;
i, len: integer;
begin
assign(f,"c:/text.txt");
reset(f);
writeln("What cut? ");
readln(s_out);
writeln("What paste? ");
readln(s_in);
len:= length(s_out);
while not Eof(f) do begin
readln(f,str);
i:= 1;
while i<>0 do begin
i:= pos(s_out,str);
if i<>0 then begin
delete(str,i,len);
insert(s_in,str,i);
end;
end;
writeln(str);
end;
close(f);
readln;
end.