link9798 link9799 link9800 link9801 link9802 link9803 link9804 link9805 link9806 link9807 link9808 link9809 link9810 link9811 link9812 link9813 link9814 link9815 link9816 link9817 link9818 link9819 link9820 link9821 link9822 link9823 link9824 link9825 link9826 link9827 link9828 link9829 link9830 link9831 link9832 link9833 link9834 link9835 link9836 link9837 link9838 link9839 link9840 link9841 link9842 link9843 link9844 link9845 link9846 link9847 link9848 link9849 link9850 link9851 link9852 link9853 link9854 link9855 link9856 link9857 link9858 link9859 link9860 link9861 link9862 link9863 link9864 link9865 link9866 link9867 link9868 link9869 link9870 link9871 link9872 link9873 link9874 link9875 link9876 link9877 link9878 link9879 link9880 link9881 link9882 link9883 link9884 link9885 link9886 link9887 link9888 link9889 link9890 link9891 link9892 link9893 link9894 link9895 link9896 link9897 link9898 link9899 link9900 link9901 link9902 link9903 link9904 link9905 link9906 link9907 link9908 link9909 link9910 link9911 link9912 link9913 link9914 link9915 link9916 link9917 link9918 link9919 link9920 link9921 link9922 link9923 link9924 link9925 link9926 link9927 link9928 link9929 link9930 link9931 link9932 link9933 link9934 link9935 link9936 link9937 link9938 link9939
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