Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2005.10.09;
Скачать: [xml.tar.bz2];

Вниз

Работа с текстовым файлом   Найти похожие ветки 

 
Агат   (2005-08-23 23:47) [0]

1) Как файл *.111 (...к примеру. Зная, что он легко открывается блокнотом) открыть в виде текстового файла?
2) Как в открытом файле выцепить только определённые строки? Скажем, строку №3, 5, 7... и т.д. Эти строки несут в себе информацию о местонахождении некоего файла.
3) Получив полный путь этих файлов, необходимо поместить все эти файлы в определённую папку.

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


 
Джо ©   (2005-08-24 00:02) [1]

(1) и (2): открываешь как обычный паскалевский TextFile и читаешь построчно используя ReadLn. Ведешь счетчик прочитанных строк, нужные строки запоминаешь и делаешь с ними что хочешь. Вариант второй: используешь класс TStringList и его метод LoadFromFile. Затем обращаешься к конкретным строкам по их номеру AStrings[I]...
(3) - CopyFile


 
Агат   (2005-08-24 00:28) [2]

Thanks Джо!


 
Джо ©   (2005-08-24 00:41) [3]

Держи, как "скелет" пойдет.
Юнит с классом, инкапсулирующим все эти манипуляции:

unit FileCop;

interface
uses Windows, SysUtils, Classes, Dialogs;

type
 TFileCopier = class
 private
   FList: TStrings;
   FDestDir: TFileName;
   FForceDirCreation: Boolean;
   procedure SetDestDir(const Value: TFileName);
 public
   constructor Create (AListFile: TFileName;
     const MinLines: Integer; AForceDirCreation: Boolean = True);
   destructor Destroy; override;
   procedure Copy (const LineNumbers: array of Integer);
   property DestDir: TFileName read FDestDir write SetDestDir;
 end;

implementation

{ TFileCopier }

procedure TFileCopier.Copy(const LineNumbers: array of Integer);
var
 I: Integer;
 FN: string;
begin

 for I := Low(LineNumbers) to High(LineNumbers) do
 begin
   FN := FList[LineNumbers[I]];
   if not CopyFile (
     PChar(FN),
     PChar(FDestDir+"\"+ExtractFileName(FN)),
     False
   ) then RaiseLastOSError;
 end;
end;

constructor TFileCopier.Create(AListFile: TFileName;
 const MinLines: Integer; AForceDirCreation: Boolean = True);
begin
 FList := TStringList.Create;
 FList.LoadFromFile(AListFile);
 if FList.Count < MinLines then
   raise Exception.CreateFmt("Количество строк в файле меньше %d",[MinLines]);
 FForceDirCreation := AForceDirCreation
end;

destructor TFileCopier.Destroy;
begin
 FList.Free;
 inherited;
end;

procedure TFileCopier.SetDestDir(const Value: TFileName);
begin
 FDestDir := Value;
 if FForceDirCreation and not DirectoryExists(FDestDir) then
   ForceDirectories(FDestDir)
end;

end.

Названия параметров, методов и свойств говорят сами за себя, впрочем вот пример использования.
Форма, на ней кнопка, в обработчике нажатия код:

procedure TForm1.Button1Click(Sender: TObject);
var
 Copier: TFileCopier;
begin
 // указываем файл, в котором хранится список,
 // минимальное кол-во строк в нем,
 // а также указываем, чтобы директория назначения создавалась
 // автоматически, если она не существует
 Copier := TFileCopier.Create("d:\1.txt",6,True);
 try
   // указываем, в какую папку копировать
   Copier.DestDir := "d:\2";
   // копируем файлы, имена которых находятся в строках 1,3 и 5.
   // (нумерация - с 0)
   Copier.Copy([1,3,5]);
 finally
   Copier.Free;
 end;
end;

Образец файла со списком:

D:\bin\TASM50\BIN\THUNK.EXE
D:\bin\TASM50\BIN\TLIB.EXE
D:\bin\TASM50\BIN\TLINK.EXE
D:\bin\TASM50\BIN\TLINK32.EXE
D:\bin\TASM50\BIN\TOUCH.EXE
D:\bin\TASM50\BIN\WINSTUB.EXE

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


 
Anatoly Podgoretsky ©   (2005-08-24 09:57) [4]

Агат   (23.08.05 23:47)  
Очень хорошо, но зачем же сразу так много вопросов? Задавай их по одному и твои шансы повысятся.


 
Агат   (2005-08-26 21:01) [5]

To: Anatoly Podgoretsky - :-)
To: Джо - Once again Thanks!!! Сейчас... пережую информацию :)

Толковый форум! Самое главное, безо всякой регистрации и рекламы! В закладки...


 
Zeqfreed ©   (2005-08-26 21:03) [6]

Агат   (26.08.05 21:01) [5]
"Отдохните от рекламы"...


 
Джо ©   (2005-08-26 21:30) [7]

Класс в [3] спроектирован наспех, если не сказать большего. Поэтому есть недочеты. В частности, исправлю тут возможность утечки памяти в конструкторе. Нужно так:
constructor TFileCopier.Create(AListFile: TFileName;
const MinLines: Integer; AForceDirCreation: Boolean = True);
begin
FList := TStringList.Create;
FList.LoadFromFile(AListFile);
if FList.Count < MinLines then
begin
  FList.Free;
  raise Exception.CreateFmt("Количество строк в файле меньше %d",[MinLines]);
end;
FForceDirCreation := AForceDirCreation
end;

Для того, чтобы не было так коряво, необходим пустяшный рефакторинг, ну да ладно ;-)


 
Агат   (2005-08-28 18:23) [8]

Подскажите, как в текстовом файле игнорировать строки, начинающиеся с символа "*"?


 
Anatoly Podgoretsky ©   (2005-08-28 20:38) [9]

if S[1] <> "*" then ...


 
Агат   (2005-08-30 14:32) [10]

Можете подсказать, в правильном направлении вообще я двигаюсь? Или чего не так?
Вот что я накидал:
=========================================
unit m3u_2_folder;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ShellAPI, ShlObj, ExtCtrls;

type
 TForm1 = class(TForm)
   OpenDialog1: TOpenDialog;
   SaveDialog1: TSaveDialog;
   Button1: TButton;
   Button2: TButton;
   Label1: TLabel;
   Label2: TLabel;
   Button4: TButton;
   Button3: TButton;
   Label3: TLabel;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
   procedure Button4Click(Sender: TObject);
   procedure Button3Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Otkuda, Kuda: boolean;
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 //Открытие диалогового окна "Открыть"
 if OpenDialog1.Execute then
  begin
   //Делаем так, чтобы было видно, какой файл выбрали
   label1.Caption := "Путь: " + LowerCase(OpenDialog1.FileName);
   Otkuda:= true;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
 TitleName : string;
 lpItemID : PItemIDList;
 BrowseInfo : TBrowseInfo;
 DisplayName : array[0..MAX_PATH] of char;
 TempPath : array[0..MAX_PATH] of char;
begin
 //Вызов диалогового окна "Обзор папок"
 FillChar(BrowseInfo, sizeof(TBrowseInfo), #0);
 BrowseInfo.hwndOwner := Form1.Handle;
 BrowseInfo.pszDisplayName := @DisplayName;
 TitleName := "Выберите директорию:";
 BrowseInfo.lpszTitle := PChar(TitleName);
 BrowseInfo.ulFlags := BIF_RETURNONLYFSDIRS;
 lpItemID := SHBrowseForFolder(BrowseInfo);
 if lpItemId <> nil then
   begin
   SHGetPathFromIDList(lpItemID, TempPath);
   GlobalFreePtr(lpItemID);
   //Делаем так, чтобы было видно, в какую папку копируем
   Label2.Caption := "Путь: " + TempPath;
   Kuda:= true;
   end;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
 Close;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
List:TStrings; //Переменная списка строк типа TStringList
begin
//Проверка на наличие выбора файла и каталога
If Otkuda <> true then
MessageDlg("Выберите файл Плей-листа. Нажмите кнопку "Откуда".",mtInformation,[mbOk],0) else
If Kuda <> true then
MessageDlg("Укажите каталог для сохранения. Нажмите кнопку "Куда".",mtInformation,[mbOk],0) else
 Begin
 List:= TStringList.Create(); //Размещаем переменную в памяти
 List.LoadFromFile(LowerCase(OpenDialog1.FileName));// Загружаем текстовый файл
 Label3.Caption := "Число строк в файле: " + (inttostr (List.Count)); //Отображение кол-ва строк в файле
 List.SaveToFile("01.txt");
 List.Free;
 End;
end;

end.
=========================================


 
Anatoly Podgoretsky ©   (2005-08-30 15:18) [11]

Агат   (30.08.05 14:32) [10]
В твоем коде не видать игнорирования строк, если ты хочешь делать это таким путем, то ты должен из удалить от туда, после загрузки.



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

Форум: "Начинающим";
Текущий архив: 2005.10.09;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.014 c
9-1110992003
[wl]
2005-03-16 19:53
2005.10.09
Кто нить пишет игрушки для мобильников?


6-1119421096
Магнум
2005-06-22 10:18
2005.10.09
Выкачать файл (http)


14-1126841752
MBo
2005-09-16 07:35
2005.10.09
Пятничные задачки. Разомнем извилины.


14-1127245822
Gero
2005-09-20 23:50
2005.10.09
Opera Voice


14-1127145267
ArtemESC
2005-09-19 19:54
2005.10.09
Во время работы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский