IPB
ЛогинПароль:

> Правила раздела!

1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> Копирование файла
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 43
Пол: Мужской

Репутация: -  0  +


Кто ни будь знает как сделать так чтобы призапуске програмы она копировала
фаил в в у казаную втексте проги папку и прописавала бы в реестре запуск этого файла при загрузки компа.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Профи
****

Группа: Пользователи
Сообщений: 930
Пол: Мужской

Репутация: -  11  +


Если требуется лишь запуск проги при старте компа, то достаточно поместить её в каталог АВТОЗАПУСК в главном меню. Ну а если тебе нужно прописать что-нибудь в реестре, проще использовать для этого прогу на дельфи. Пусть паскалевская прога создаст *.bat файл, а уж он запустит дельфийскую. :D Немного коряво, но эффектно. Если хочешь просто поприкалываться, то можно просто подставить свою прогу вместо уже прописанной в реестре ;) Батник отлично может копировать и стирать файлы, вот только если ты задашь команду del *.* хрюша возможно запросит подтверждения, а вот del *.ini скорее всего прокатит :o
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 43
Пол: Мужской

Репутация: -  0  +


SKVOZNJAK спасибо попробую
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Четыре квадратика
****

Группа: Пользователи
Сообщений: 579
Пол: Мужской

Репутация: -  4  +


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

А можно вообще не в реестр прописываться (ДОСовой проге это ни к чему), а в win.ini - в разделы [run] и [start]. Правда, не знаю, как там в ХР с win.ini сделано...


--------------------
Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Прогрессор
****

Группа: Пользователи
Сообщений: 602
Пол: Мужской
Реальное имя: Михаил

Репутация: -  9  +


Всё собираюсь и никак не соберусь выложить прогу, копирующую файлы и папки с файлами в указанное место чисто паскальскими средствами с BlockRead и BlockWrite. Надо ее еще закомментировать. Долго писал, но получилось неплохо. Большие папки( до нескольких сотен метров) копирует чуть ли не быстрее, чем "вручную", через винду. А если произвести не очень большие изменения, то можно делать много прикольных вещей: копировать сразу в несколько папок, копировать определённый тип файлов, удалять или создавать определённые файлы во всех вложенных папках, выдавать их общий размер... Или делать не очень добрые вещи.
Когда собирался заглянуть к другу, ровно за 2 минуты так изменил прогу, что она в выбранной папке и во всех ее вложенных папках создавала файл XAXAXA.txt
Выбрал у него не компе папку в сотню метров. Подпапок в ней, соответственно было, может тысяча. Запустил прогу и со словами "Знай программистов универа!" набрал имя папки. Пять минут любовался многоточиями, плавающими в воздухе над другом, который открывал каждую подпапку и стирал хихиканьки. Потом ехидно сказал:"Да как ты мог подумать?! Мы, программисты, люди мирные. Перед тем , как папку поганить, я ее скопировал сначала!"
З. Ы. А ведь был сильное искушение набрать "D:/"...
З. З. Ы. Правда и "антивир" пишется тоже за 2 минуты.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Прогрессор
****

Группа: Пользователи
Сообщений: 602
Пол: Мужской
Реальное имя: Михаил

Репутация: -  9  +


А вот и прога:
uses dos,crt;
const Recs=100; {записи нетипизированного файла}

var buf: array [1..512*Recs] of byte;

{Iz - имя файла}
{V - папка, куда он будет скопирован}
function Kopy3(Iz,V:string):byte;
var f, f1:file;
Dir:DirStr;
Name:NameStr;
Ext:Extstr;
i,s:longint;
text512:array[1..512] of char;
ost:word;
at:word;
begin
Kopy3:=0;
FSplit(Iz,Dir,Name,Ext);
{$I-}assign(f,Iz);{$I+}
if ioresult<>0 then Kopy3:=1 else
begin
GetFAttr(f,at); if at mod 2 = 1 then SetFAttr(f,at-1);
{$I-}reset(f,1); {$I+}
if ioresult<>0 then Kopy3:=2 else
begin
seek(f,0);
{$I-}assign(f1,V+Name+Ext);{SI+} rewrite(f1,1);
if ioresult<>0 then Kopy3:=3 else
begin
seek(f1,0);
s:=filesize(f);
if s<=512 then
begin
Blockread(f,buf,s);
Blockwrite(f1,buf,s);
end
else {размер файла больше 512 байт}
begin
ost:=s mod 512;
if s<=512*Recs then
begin
Blockread(f,buf,s-ost);
Blockwrite(f1,buf,s-ost);
end
else {файл большой}
begin
for i:=1 to (s div (512*Recs)) do
begin
Blockread(f,buf,512*Recs);
Blockwrite(f1,buf,512*Recs);
end;
Blockread(f,buf,(s mod (512*Recs))-ost);
Blockwrite(f1,buf,(s mod (512*Recs))-ost);
end;
Blockread(f,buf,ost);
Blockwrite(f1,buf,ost);
end;
SetFAttr(f,at); SetFAttr(f1,at);
close(f1);
end;
close(f);
end;
end;
end;


function KopyDir(Iz,V:string):byte;
var Dir:DirStr;
Name:NameStr;
name0:string;
Ext:Extstr;
s:searchRec;
at,i,l:byte;
OK:boolean;
begin
name0:='..';
KopyDir:=0;
FSplit(Iz,Dir,Name,Ext); writeln(dir,' ',Name,' ',Ext); {readln;}
MKDir(V+Name);
CHDir(IZ);
FindFirst('*.*', Anyfile, s);
FindNext(S);
FindNext(S);
OK:=true;
while OK and not(s.name='.') and not(s.name='..') do
begin
name0:=concat(s.name,' '); {writeln(name0); readln;}
l:=length(s.name);
at:=s.attr;
if ((at>=16) and (at<64) and ((at>=48) or (at<32))) then
KopyDir:=KopyDir(Iz+'\'+S.Name,V+Name+'\')
else Kopy3(Iz+'\'+s.name,V+Name+'\');
FindNext(S);

if l=length(s.name) then
begin
for i:=1 to length(s.name) do
if not(name0[i]=s.name[i]) then begin OK:=true; break; end
else OK:=false;
if not(OK) then OK:= not(name0[1+length(s.name)]=' ');
end;
end;
end;


var i:word;
k:byte;
begin
clrscr;
write(KopyDir('D:\lab','D:\Chess\'));{пример вызова процедуры}
{write(Kopy3('D:\dm5.bsp', 'D:\Њ®с\'));}
readln;
end.

Прогу писал абсолютно самостоятельно, но всё-таки работает. smile.gif Недоделана, правда, обработка ошибок. Хотя, по идее, их и не должно возникать, если не пытаться копировать на защищённый диск или вообще в никуда. Если можно ещё оптимизировать код, подскажите.
Замечания по проге:
  1. Если компилировать в TP, то имена копируемых файлов усекаюся до 8 букв.
    А Virtual Pascal всё делает нормально.
  2. Строчкой if at mod 2 = 1 then SetFAttr(f,at-1); снимается защита с файлов, если она есть, а потом вновь устанавливаем её у исходного и созданного файлов. В принципе, если так переделывать прогу, чтобы она перемещала файлы, то можно выдавать запрос на перемещение таких файлов, как это делает винда.
  3. Зачем за строчкой FindFirst('*.*', Anyfile, s); поставлено два финднекста?
    Потому что Паскаль сначала выдаёт '..' , затем '.' и уже после этого имена реально существующих файлов, хоть убей, не пойму, почему. Может, кто может сказать?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Знаток
****

Группа: Пользователи
Сообщений: 408
Пол: Мужской

Репутация: -  3  +


Ну копирование это то не сложно, а вот реестр ) чтоб пользователь не знал...


--------------------
- Где я?
- Во тьме.
- В какой тьме?
- Во тьме твоего мозга.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Новичок
*

Группа: Пользователи
Сообщений: 43
Пол: Мужской

Репутация: -  0  +


Atos программку посмотрю, если получется что то улучшить обезательно напишу. Может есть какиенибуть идеи насчет реестра.

Сообщение отредактировано: Darkwolf -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Прогрессор
****

Группа: Пользователи
Сообщений: 602
Пол: Мужской
Реальное имя: Михаил

Репутация: -  9  +


К сожалению, во всём, что касается реестра, автозапуска и прочего такого я сам полный чайник, буду благодарен, если кто-нибудь поподробнее объяснит.
Кстати, ещё немного теории. Что означает атрибут файла? Атрибут файла равен
ord(файл защищён)*1+ord(файл скрыт)*2+ord(файл системный)*4+ord(файл - заголовок тома{ксатати, что это такое, я тоже не понял})*8+ord(папка)*16+ord(файл архивный)*32.
Так что строчка проги if ((at>=16) and (at<64) and ((at>=48) or (at<32)))
означает if(этот файл - папка)
Просто написать if at=Directory было бы некоректно. Directory - это константа, равная 16. Но нам ведь нужно найти ВСЕ папки, в том числе и архивные, и скрытые и всякие разные. А прога бы попыталась копировать некоторые такие папки как простые файлы.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Новичок
*

Группа: Пользователи
Сообщений: 43
Пол: Мужской

Репутация: -  0  +


Atos если есть ещё интересные программки и матерьялы скидывай мне на так называемый личный ящик. Есле нужен в чём то совет всегда рад услышать.

Сообщение отредактировано: Darkwolf -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Атрибут есть у каждого файла или папки,
1) У папки может быть следующие атрибуты: от 16 до 31 и от 48 до 64 (в десятичной записи) или если записать математически ,то [16,31]V[48,64]
2) У файла может быть все остальное, т.е до 16 и от 31 до 48.

Если надо удалить файл или изменить его, а атрибут у него - только чтение (ReadOnly), то делаем следующее: SetFAttr(f,0); - ставим атрибут- просто файл!
и теперь хоть удаляй, хоть переписывай!

--------------------------
Про реестр. Вот, что я обнаружил в статье по его оптимизации:

Файлы реестра можно немного ужать в размере, если, сначала, экспортировать его в
текстовый файл, а затем восстановить из этого файла. Для этого в меню "Run" наберите
REGEDIT /E REGTXT.REG, затем, загрузите ДОС и наберите команду REGEDIT /C
REGTXT.REG (без кеширования диска Smartdrive'ом процесс займет несколько часов!!!).

-----------------------------------
Сам я не пробовал, но мне кажется, это единственный способ работы с реестром , в досе (т.е в текстовом виде)
Реестр похудеет на сотню килобайт.

Сообщение отредактировано: Oleg_Z -


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Профи
****

Группа: Пользователи
Сообщений: 775
Пол: Мужской

Репутация: -  0  +


2Oleg_Z: Ты имел ввиду единственный способ работы с реестром в досе средствами regedit'a??

Чтобы усер не увидел, надо имхо знать формат файла реестра:
Почитать мона здесь: http://paullee.ru/regstr4.html
И здесь: http://www.google.com.ru/search?q=%F4%EE%F...%E5%F1%F2%F0%E0
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Прогрессор
****

Группа: Пользователи
Сообщений: 602
Пол: Мужской
Реальное имя: Михаил

Репутация: -  9  +


Цитата
Реестр похудеет на сотню килобайт.

А это что-то даёт, кроме просто увеличения свободного место на диске? Ведь для современных многогиговых хардов 100 К, в общем-то роли не играет.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Четыре квадратика
****

Группа: Пользователи
Сообщений: 579
Пол: Мужской

Репутация: -  4  +


Теоретически, должна возрасти скорость работы с реестром. Фактически -- не пробовал =)

С реестром ИМХО можно работать, составляя reg-файлы, какие надо, и regedite'ом их всандаливать =) регедит запускать из проги


--------------------
Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Бывалый
***

Группа: Пользователи
Сообщений: 180
Пол: Мужской

Репутация: -  2  +


для физического ужатия файлов реестра как в W98, так и в XP, есть хорошая утилита RegCompact (перед ней не помешает запустить какой-нить RegClean)

насчет атрибутов файлов: надо просто разложить байт атрибутов на биты, и посмотреть, какие включены, а какие нет. Константа faDirectory=16? значит признак каталога - включенный 4-й бит... и т.д. Для проверки обычно пишут не (atr=faDirectory), а (atr and faDirectory<>0) или (atr and faDirectory=faDirectory). для установки/сброса бита пишут newatr:=atr or faHidden/newatr:=atr and not faReadonly (not здесь означает 255-faReadonly)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Бывалый
***

Группа: Пользователи
Сообщений: 180
Пол: Мужской

Репутация: -  2  +


по поводу копирования файлов - делал я когда-то небольшую утилитку под ДОС, копирование файла с использованием верхней памяти в качестве буфера (до 16-ти мегабайт), большие файлы копировались быстрее, чем например командой copy, прикольно было с дискеты копировать - загрузил сразу всю дискету в память, и можно доставать, а он в это время на винт скидывает... или на одном винте чтоб часто с дорожки на дорожку не прыгал, время не терял, или с сидюка тормозного, минуту грузит, полминуты отдыхает. Только smartdrive не надо включать, хуже становится smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Прогрессор
****

Группа: Пользователи
Сообщений: 602
Пол: Мужской
Реальное имя: Михаил

Репутация: -  9  +


Круто... P@sh@, а исходник не выложишь?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Гость







Uses WinProcs,Strings,ShellAPI;

Const
 DestinationPoint:PChar='C:\MyProg.Exe';

Var
 r:LongInt;
 e:Integer;

Begin
 If RegCreateKey($80000002,'SoftWare\MicroSoft\Windows\CurrentVersion\Run',r) = ERROR_SUCCESS Then
   If RegSetValue(r,'MyProg',REG_SZ,DestinationPoint,StrLen(DestinationPoint))= ERROR_SUCCESS Then
     e:=0
   Else
     e:=2
 Else
   e:=1;
 Case e Of
   0:MessageBox(0,'NoError','NoError',0);
   1:MessageBox(0,'Unable to create subkey','Unable to create subkey',0)
   Else MessageBox(0,'Failed to save','Failed to save',0)
 End;
 RegCloseKey®
End.



Если это поможет...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Бывалый
***

Группа: Пользователи
Сообщений: 180
Пол: Мужской

Репутация: -  2  +


программа копирования файлов (одного файла за раз) с использованием буфера в XMS...
Реализация (вместе с дополнительным модулем) перенесена сюда: FAQ: Файлы
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Прогрессор
****

Группа: Пользователи
Сообщений: 602
Пол: Мужской
Реальное имя: Михаил

Репутация: -  9  +


Да, до такого мне ещё расти... Обязательно попытаюсь разобраться. Только один вопрос: XMS - это стандартный модуль в одной из версий Паскаля или его надо как-то отдельно искать? Да, и какая есть литература по таким вот фокусам с памятью?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

2 страниц V  1 2 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 22.10.2020 1:53
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name