Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Теоретические вопросы _ Работа с папками

Автор: Qleek 28.01.2005 15:31

Здравствуйте, это мое первое сообщение на форуме... smile.gif
Вот у меня такая задачка:
прога должна считать с дискеты названия папок и вывести их на экран.
Сразу вопрос: возможно ли это если дириктории имеют русские названия или название слишком длинное...?
Полистал учебники, но ничего похожего не нашел... sad.gif
Помогите пожалуйста, если можете...

Автор: volvo 28.01.2005 15:41

Qleek
Каким компилятором пользуемся? Если ТР, то в случае длинного имени оно будет усекаться до 8-ми знаков (вместо "My Documents" будет "MYDOCU~1"). Кириллица, насколько я помню, через ТР не отображается.

Автор: Altair 28.01.2005 20:37

Цитата
Кириллица, насколько я помню, через ТР не отображается.

Отображается!
Любые имена хорошо отображаются, была бы загруженна кодовая страница 866.
И усекаются жо 8 симв. имя...

Автор: Qleek 28.01.2005 21:29

Так вот мой вопрос сам по себе: как заставить программу прочитать название папок? для этого есть команда? А компилятор - TP7. И еще, если имя более 8 символов, сможет ли программа в этой папке, которую найдет на дискете, создать текстовый файл?

Автор: volvo 28.01.2005 21:46

Цитата(Qleek @ 28.01.05 16:29)
как заставить программу прочитать название папок? для этого есть команда?

Для этого пользуемся вот такой конструкцией (она ищет все директории в корневом каталоге 'A:\' и печатает их названия...):
Код

uses dos;
var sRec: SearchRec;
begin
 findfirst('A:\*.*', directory, sRec);
 while doserror = 0 do
   begin
     with sRec do write(name:15);
     findnext(sRec)
   end;
end.

Автор: Qleek 28.01.2005 22:13

ух ты.... оно даже работает... :D спасибо....
но у меня назрел еще вопрос:
можно ли каждой папке присвоить свою переменную?
и если это переменная равна заложенной в программе, открыть эту папку и записать файл именно туда.... те прога должна спросить у меня в какую папку нада файлик бросить...

Автор: volvo 28.01.2005 22:37

Qleek

Цитата
оно даже работает...
blink.gif А если оно не работает, зачем постить?

А насчет
Цитата
прога должна спросить у меня в какую папку нада файлик бросить...
Просто читаем имя папки, проверяем, что она существует, и копируем в нее файл... К сожалению, средства копирования файлов в Паскаль не встроены, и надо писать свою функцию, или вызывать "command.com"

Автор: Qleek 28.01.2005 23:04

Цитата
А если оно не работает, зачем постить?

это юмор... smile.gif
Цитата
Просто читаем имя папки

если можно, пожалуйста поподробнее, а то у меня не получилось...

Автор: volvo 28.01.2005 23:18

Что значит не получилось? Я бы делал так:

Код
uses dos;
var sRec: SearchRec;
const
 name_to_copy = 'C:\test.exe';
begin
 write('enter the dir name: '); readln(s);
 findfirst('A:\'+s, directory, sRec);
 if DosError <> 0 then halt; {директория не существует}
 ...
 {а вот тут - каким-то образом копировать файл
 с именем name_to_copy в папку 'A:\'+s}
end.

Автор: Altair 28.01.2005 23:33

Цитата
К сожалению, средства копирования файлов в Паскаль не встроены, и надо писать свою функцию, или вызывать "command.com"

Не обязательно через command.com, можно побайтово копировать, или еще способ красивый через объекты (см. ФАК)

Автор: Qleek 29.01.2005 1:02

:molitva: Большое спасибо, вы мне очень помогли...

Автор: Digitalator 29.01.2005 4:19

Цитата(Oleg_Z @ 29.01.05 3:33)
Не обязательно через command.com, можно побайтово копировать, или еще способ красивый через объекты (см. ФАК)

ООП хорошо когда в меру - скоро уже начнут каждый пиксель на экране монитора представлять как объект (причем как наследник базового класса с примерно 30 методами, 3 разными конструкторами и полусотней полей, которые будут в являться объектами, записями, всевозможными дескриптормаи )

А по теме - чем тебя BlockRead + Blockwrite смущает, для такой архисложнойзадачи думаю они в самый раз smile.gif

Автор: Altair 29.01.2005 4:24

Цитата
А по теме - чем тебя BlockRead + Blockwrite смущает, для такой архисложнойзадачи думаю они в самый раз

Меня ничем, но рассказать стоит имхо про все.

Автор: Digitalator 29.01.2005 4:35

не могу не согласиться :yes:

Автор: Qleek 29.01.2005 16:14

В процессе написания программы у меня возник один ламерской вопрос:
вот есть у меня переменная:

Цитата
Var  st:string;

можно ли этой переменную приравнять к названию одной из папки?

Автор: FreeMan 29.01.2005 16:27

Код
uses dos;
var sRec: SearchRec;
st:string;
begin
findfirst('A:\*.*', directory, sRec);
if doserror=0 then st:=sRec.Name else halt(1);
WriteLn(st);  
end.

Можно

Автор: Qleek 29.01.2005 20:30

FreeMan, спасибо.
Господа, позвольте поинтересоваться:
возможен ли поиск скрытых папок и файлов?

Автор: volvo 29.01.2005 20:48

Цитата
возможен ли поиск скрытых папок и файлов?

Вполне... Вот эта программка печатает имена скрытых папок на F:\
Код
uses dos;
var sRec: SearchRec;
begin
 writeln('results');
 findfirst('F:\*.*', directory+hidden, sRec);
 while doserror = 0 do
   begin
     with sRec do
       if attr and hidden = hidden then write(name:15);
     findnext(sRec)
   end;
end.

Автор: Qleek 29.01.2005 21:15

Цитата
directory+hidden

а какие здесь еще можно употребить параметры?

Цитата
writeln('results')

поясните пожалуйста эту строчку...

Автор: volvo 29.01.2005 21:24

Первая строчка - "пережиток прошлого" lol.gif Я просто забыл ее удалить (проверял программу с разными атрибутами и вставил ее чтобы разграничивать результаты)...

А насчет какие еще параметры доступны... Вот что определено в модуле Dos:

Код

Const
   ReadOnly = $01;
   Hidden = $02;
   SysFile = $04;
   VolumeID = $08;
   Directory = $10;
   Archive = $20;
   AnyFile = $3F;

Автор: Qleek 29.01.2005 21:24

она просто выводит слово results? или нужна еще для чего-нибудь?

Автор: volvo 29.01.2005 21:29

Цитата(Qleek @ 29.01.05 16:24)
просто выводит слово results

:yes:

Автор: Qleek 30.01.2005 1:45

Цитата
Любые имена хорошо отображаются, была бы загруженна кодовая страница 866

подскажите, пожалуйста, как это сделать...

Автор: P@sh@ 31.01.2005 16:38

Qleek
это делается при загрузке системы всяко хорошо тебе знакомыми строчками в autoexec.bat:
mode con codepage prepare=((866) C:\WINDOWS\COMMAND\ega3.cpi)
mode con codepage select=866
smile.gif
и еще пожалуй загрузкой драйвера display.sys в файле config.sys