Помощь - Поиск - Пользователи - Календарь
Полная версия: Запуск и переименование файла
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
AlexSCH
У меня такой вопрос:
Программа написанная в делфи считывает файл, который перед этим преобразовывается другой программой, эта дополнительная программа запускается по событию через делфи программу. Получается что по нажатию кнопки в прге написанной на делфи запускается дополнительная программа на диске и преобразовывает файл формата 1 (например) в файл формата2, и только затем программа написанная на делфи считывает файл (формата 2). Получается что название файла для подпрограммы должно быть четко фиксированным, а самой прогой которая в делфи написана надо открывать файлы любого названия, но так как она использует перед открытием подпрограмму, этого сделать не получается. Вот что я придумал, при запуске основной программы (делфи) переименовывать файл нужный для открытия в то зафиксированное имя, нужное для работы подпрограммы. Как это можно сделать?
volvo
AlexSCH, я не понял, в чем проблема? Ты просто не знаешь, как переименовать файл?
Var f: File;
...
Assign(f, old_name);
Rename(f, new_name);
AlexSCH
не просто переименовать.
Ситуация такая, что нажав кнопку загрузить на форме, появляется диалоговое окно, где предлагается выбрать какой же файл загружать, так вот в тот момент когда я выбераю файл формата1, должно вот что произойти: этот файл который я выбираю, с помощью диалогового окна, нужно переименовать, чтобы он назывался так как это прописано в подпрограмме, которая уже в свою очередь преобразует его в формат2. просто я не знаю как связать вот тот выбор (клик) на файле в диалоговом окне выбора и какой-то переменной в делфи. просто файлов будет много и как то конкретно связать не получается, выходит что вот кликнул ты на файле и как то надо узнать (для основной программы) его имя, чтобы переименовать.
volvo
Ну, если ты пользуешься TOpenDialog, то у него есть метод FileName, а вообще знаешь, что? Приведи код, и укажи, что ИМЕННО с чем ИМЕННО ты не можешь связать, почему КТО-ТО ДРУГОЙ должен догадываться, как и что с чем у тебя связано???
mj
а может передавать в запускаемую программу имя файла?
AlexSCH
Цитата(volvo @ 20.07.2006 18:01) *

Ну, если ты пользуешься TOpenDialog, то у него есть метод FileName, а вообще знаешь, что? Приведи код, и укажи, что ИМЕННО с чем ИМЕННО ты не можешь связать, почему КТО-ТО ДРУГОЙ должен догадываться, как и что с чем у тебя связано???

В переменную test помещается имя открываемого файла (может быть абсолютно любое), до того как начнется загрузка файла в мемо1, нужно нужно сделать временную копию и переименовать открываемый файл в hex.hex и записать его на диск в эту же директорию с программой, где уже подпрограмма сделает из hex.hex файл PB.txt, который и пойдет в мемо1
То есть в поле ?????? должно быть что-то наподобии: файл"любое имя" по открытию в OpenDialog1-->сделать копию-->переименовать копию в "hex.hex"-->записать на диск в ту же директорию где выполняется программа-->(далее с hex.hex работает подпрограмма, эта часть уже есть)-->удалить копию, переименованную в hex.hex
If OpenDialog1.Execute
then begin
Test:=OpenDialog1.FileName;
??????????????????????????????
Memo1.Lines.LoadFromFile("pb.txt");
end;
end;

Извиняюсь за неккоректные объяснения в предыдущих постах.
Заранее спасибо
Гость
Действительно никто не знает как это делается?
нужно чтобы при открытии через opendialog программа переименовывала открываемый файл
Помогите пожалуйста.

Malice
Цитата(Гость @ 24.07.2006 23:21) *

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

Насколько я понял из твои объяснений:
Цитата
сделать копию-->переименовать копию в "hex.hex"-->записать на диск в ту же директорию где выполняется программа

Это значит скопировать открываемый файл в "hex.hex". Переименование не знаю для чего ты приплел. И если так, то вот, что тебе надо:
// процедура копирования файла
procedure CopyFile(Source, Destination: string);
var
FromF, ToF: file of byte;
Buffer: array[0..4096] of char;
NumRead: integer;
FileLength: longint;
begin
AssignFile(FromF, Source);
reset(FromF);
AssignFile(ToF, Destination);
rewrite(ToF);
FileLength := FileSize(FromF);
while FileLength > 0 do begin
BlockRead(FromF, Buffer[0], SizeOf(Buffer), NumRead);
FileLength := FileLength - NumRead;
BlockWrite(ToF, Buffer[0], NumRead);
end;
CloseFile(FromF);
CloseFile(ToF);
end;

Использование в твоем случае:
If OpenDialog1.Execute
then begin
Test:=OpenDialog1.FileName;
CopyFile(Test,'hex.hex'); // <--
............
Memo1.Lines.LoadFromFile("pb.txt");
end;
end;
AlexSCH
На строке
CopyFile(Test,'hex.hex');
выдает ошибку [Error] Unit1.pas(250): Incompatible types: 'String' and 'PAnsiChar'
я так понимаю тут что-то с типами неувязка, как быть?
Malice
Цитата(AlexSCH @ 25.07.2006 12:06) *

На строке
CopyFile(Test,'hex.hex');
выдает ошибку [Error] Unit1.pas(250): Incompatible types: 'String' and 'PAnsiChar'
я так понимаю тут что-то с типами неувязка, как быть?

Объяви test как String, или пиши CopyFile(OpenDialog1.FileName,'hex.hex');
AlexSCH
Test объявлена как string, с самого начала была.
Если пишу
CopyFile(OpenDialog1.FileName,'hex.hex');
выдает такую же ошибку про несовместимость типов 'String' and 'PAnsiChar'
Malice
Цитата(AlexSCH @ 25.07.2006 15:35) *

Test объявлена как string, с самого начала была.
Если пишу
CopyFile(OpenDialog1.FileName,'hex.hex');
выдает такую же ошибку про несовместимость типов 'String' and 'PAnsiChar'

Потому, что ты используешь Api-шную функцию CopyFile (про которую я забыл), а не ту, которую привел я.
Тогда мою стирай вообще и делай так:
CopyFile(pchar(OpenDialog1.FileName),'hex.hex',true);
hardcase
Люди, вы чего ерундой откровенной занимаетесь?
Зачем переименовывать, копировать.....
Есть такие вещи как hardlink-жесткие ссылки. Создать временно жёсткую ссылку на файл и всё!

Апишка: CreateHardLink

Примечание: этот способ будет работать на NTFS.

Жёсткую ссылку можно удалить как обычный файл.
AlexSCH
Большое всем спасибо (особенно Malice) за оказанную помощь, все заработало как требовалось.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.