C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
копирование файлов
Маша
Отправлено: 06.10.2004, 14:13


Не зарегистрирован







Здравствуйте!
У меня Борланд С++Билдер 6.
В программе надо скопировать файл из одной папки в другую.
Файлы могут быть разные (.dwg, .tif, .doc, .txt и др.)
Помогите, плиз, примерами или ссылками на них.
joynter
Отправлено: 06.10.2004, 14:50


Станционный диспетчер

Группа: Участник
Сообщений: 137



SHCopyFile(String DirFrom, String DirTo, UINT wF)
{
SHFILEOPSTRUCT op;
int I;
ZeroMemory(&op, sizeof(op));
op.hwnd = 0;
op.pFrom = DirFrom.c_str();
op.pTo = DirTo.c_str();
op.wFunc = wF; // wF может быть FO_DELETE, FO_MOVE , FO_RENAME , FO_COPY
return SHFileOperation(&op);
}
Маша
Отправлено: 06.10.2004, 15:52


Не зарегистрирован







Спасибо.
И ещё подскажите — как скопировать файл с другим именем?
Konstantine
Отправлено: 06.10.2004, 16:06


Мастер участка

Группа: Модератор
Сообщений: 545



почитай API-шный Help по функции CopyFile

P.S.: неужели в реале есть программистки???
Хлор
Отправлено: 07.10.2004, 00:17


Дежурный стрелочник

Группа: Участник
Сообщений: 78



to Konstantine:
Судя по второму заданому вопросу, то нет smile.gif
Хотя..... smile.gif)))))))))))
Маша
Отправлено: 07.10.2004, 09:58


Не зарегистрирован







cool.gif
Ну вообще-то мне бы хотелось увидеть что-то вроде:
Открываем файл, в цикле читаем из него блоки байтов и записываем их в новый файл.
Теоретически мне всё понятно FileRead, FileWrite... Не понятно про буфер — как его описать и как сделать цикл: while(<здесь что — int handle?> != eof)?
Поделитесь знаниями — может тогда и в реале программистки появятся smile.gif
timson
Отправлено: 07.10.2004, 11:30


Станционный диспетчер

Группа: Участник
Сообщений: 82



QUOTE
Открываем файл, в цикле читаем из него блоки байтов и записываем их в новый файл.


вот так копируется 1 файл (не проверял, но должно работать):
CODE

#define BLOCK_SIZE 1024 * 1024

int CopyFile(char* src, char* dst)
{
char* block = (char*) malloc(BLOCK_SIZE);

   FILE* fsrc = fopen(src, "rb");
   FILE* fdst = fopen(dst, "wb");

   while ( !feof(fsrc) )
   {
    int BytesRead = fwrite(block, 1, BLOCK_SIZE, fsrc);
 fwrite(block, 1, BytesRead, fdst);
   }

   free(block);

   fclose(fsrc);
   fclose(fdst);
}

где src и dst — имена фйлов с путем.

но здесь надо много учесть, делать проверки на существовании src файла, о выделении памяти, прочитано байт == записано байт.
еще надо атрибуты файлов копировать...

размер блока (BLOCK_SIZE) желательно делать кратным 4 байт (вроде лучше 32 байта, че-то в таком роде — размер страницы)

я пробовал сам написать функцию, которая копирует файлы — работающую быстрее системной, но ОС Win мастдай, область памяти под блок на swap кидает и обламывает.
и запретить сброс в swap большой область памяти никак (может не документированные возможности ядра позволяют сделать??)

QUOTE
Поделитесь знаниями — может тогда и в реале программистки появятся

они есть.., но их мало, а хотель бы больше.... smile.gif
Gedeon
Отправлено: 07.10.2004, 11:50


Ветеран

Группа: Модератор
Сообщений: 1742



2Маша
Так а зачем такие сложности, мы что легких путей не ищем, Вам правильно написали
CODE

BOOL CopyFile(
 LPCTSTR lpExistingFileName,
 LPCTSTR lpNewFileName,
 BOOL bFailIfExists
);


АПИ функция, есть борландовская
CODE

function CopyFileTo(const Source: string; const Destination: string): Boolean;


Чем обьясните мне они не подходят? Или лениво хэлп читать?
Boyko
Отправлено: 07.10.2004, 16:17


Станционный диспетчер

Группа: Участник
Сообщений: 88



QUOTE (Маша @ 07/10/2004, 10:00)
cool.gif
Ну вообще-то мне бы хотелось увидеть что-то вроде:
Открываем файл, в цикле читаем из него блоки байтов и записываем их в новый файл.
Теоретически мне всё понятно FileRead, FileWrite... Не понятно про буфер — как его описать и как сделать цикл: while(<здесь что — int handle?> != eof)?
Поделитесь знаниями — может тогда и в реале программистки появятся  smile.gif


2Маша

Нашел что-то сделано когда-то. Поделяю!

CODE

int MyOpenFile(int& myHandle, AnsiString fileName, unsigned short int openMode, int myRecLen)
{
int fileLength;
try
{
 myHandle = FileOpen(fileName, openMode);
 if (myHandle==-1) {
  fileName.Insert(" can't be opened. My Program will terminate!",fileName.Length()+1);
  Application->MessageBox(fileName.c_str(), "Catastrophic Error!", MB_OK);
  Application->Terminate();
 }
 fileLength = FileSeek(myHandle,0,2);
 if (openMode!=fmOpenWrite)
  FileSeek(myHandle,0,0);
 return fileLength/myRecLen; // Number of Records
}
catch(...)
{
 Application->MessageBox("Can't perform one of the following file operations: Open, Seek."
  , "File Error", MB_OK);
 Application->Terminate();
 return -1;
}
}


int fileNew=FileCreate("File.New");
if (fileNew==-1) {
 Application->MessageBox("Can't Open/Create File!",
  "Error", MB_OK);
 return;
}
AnsiString fileName("File.Old");
int fileNumber=MyOpenFile(fileHandle,fileName,fmOpenRead,myRecLen);
for (int i=0; i<fileNumber; i++) {
 FileRead(fileHandle,G,myRecLen); // G указатель (структура блока)
 if (memcmp(G->firstName,"Машенка",7)!=0)
  FileWrite(fileNew,G,myRecLen);
 else {
                                   memcpy(G->Quality,"Самая лучшая програмистка!",26);
  FileWrite(fileNew,G,myRecLen);
                               }
}
FileClose(fileHandle);
FileClose(fileNew);


PS Разрешаю модифицировать!
Хлор
Отправлено: 07.10.2004, 17:52


Дежурный стрелочник

Группа: Участник
Сообщений: 78



2Masha
Как сказал Gedeon, зачем такие сложности ? Зачем второй раз изобретать колесо ? smile.gif)))))

Используйте все же CopyFile
timson
Отправлено: 07.10.2004, 19:48


Станционный диспетчер

Группа: Участник
Сообщений: 82



QUOTE (Хлор @ 07/10/2004, 18:54)
Используйте все же CopyFile

да когда просто нужна функция,
но если пишем файловый менеджер, то надо че-нить искать быстрее...
Георгий
Отправлено: 07.10.2004, 20:13


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



QUOTE (timson @ 07/10/2004, 20:50)
QUOTE (Хлор @ 07/10/2004, 18:54)
Используйте все же  CopyFile
но если пишем файловый менеджер, то надо че-нить искать быстрее...

ага, а потом все будут удивляться — почему файлы с раздела на раздел медленно копируются а в пределах одного раздела быстро sad.gif
timson
Отправлено: 08.10.2004, 06:38


Станционный диспетчер

Группа: Участник
Сообщений: 82



QUOTE (Георгий @ 07/10/2004, 21:15)
ага, а потом все будут удивляться — почему файлы с раздела на раздел медленно копируются а в пределах одного раздела быстро sad.gif

не совсем понял мысль.. причем здесь раздел..

вот система когда копирует, то в начале вроде быстро, а потом начинаются такие тормоза (файлик 700мб копируется ~11 мин в пределах винта). вроде мои железки системе не нравятся.
хочу отметить что эта проблема только в ОС Win. в линухе все летает.
что-то win с буферами не ладит... sad.gif
Маша
Отправлено: 08.10.2004, 09:04


Не зарегистрирован







Всем спасибо за помощь.
Я сейчас действительно использую все же CopyFile smile.gif, но есть подозрение что скоро понадобится не только он (потому и спрашивала).
Konstantine
Отправлено: 08.10.2004, 10:21


Мастер участка

Группа: Модератор
Сообщений: 545



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

Отредактировано Konstantine — 08/10/2004, 11:24

Вернуться в Вопросы программирования в C++Builder