Маша |
Отправлено: 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:
Судя по второму заданому вопросу, то нет
Хотя..... )))))))))))
|
|
Маша |
Отправлено: 07.10.2004, 09:58 |
|
Не зарегистрирован
|
Ну вообще-то мне бы хотелось увидеть что-то вроде:
Открываем файл, в цикле читаем из него блоки байтов и записываем их в новый файл.
Теоретически мне всё понятно FileRead, FileWrite... Не понятно про буфер — как его описать и как сделать цикл: while(<здесь что — int handle?> != eof)?
Поделитесь знаниями — может тогда и в реале программистки появятся |
|
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 | Поделитесь знаниями — может тогда и в реале программистки появятся |
они есть.., но их мало, а хотель бы больше....
|
|
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) |
Ну вообще-то мне бы хотелось увидеть что-то вроде:
Открываем файл, в цикле читаем из него блоки байтов и записываем их в новый файл.
Теоретически мне всё понятно FileRead, FileWrite... Не понятно про буфер — как его описать и как сделать цикл: while(<здесь что — int handle?> != eof)?
Поделитесь знаниями — может тогда и в реале программистки появятся |
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, зачем такие сложности ? Зачем второй раз изобретать колесо ? )))))
Используйте все же 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 | но если пишем файловый менеджер, то надо че-нить искать быстрее... |
ага, а потом все будут удивляться — почему файлы с раздела на раздел медленно копируются а в пределах одного раздела быстро |
|
timson |
Отправлено: 08.10.2004, 06:38 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 82
|
QUOTE (Георгий @ 07/10/2004, 21:15) | ага, а потом все будут удивляться — почему файлы с раздела на раздел медленно копируются а в пределах одного раздела быстро |
не совсем понял мысль.. причем здесь раздел..
вот система когда копирует, то в начале вроде быстро, а потом начинаются такие тормоза (файлик 700мб копируется ~11 мин в пределах винта). вроде мои железки системе не нравятся.
хочу отметить что эта проблема только в ОС Win. в линухе все летает.
что-то win с буферами не ладит...
|
|
Маша |
Отправлено: 08.10.2004, 09:04 |
|
Не зарегистрирован
|
Всем спасибо за помощь.
Я сейчас действительно использую все же CopyFile , но есть подозрение что скоро понадобится не только он (потому и спрашивала). |
|
Konstantine |
Отправлено: 08.10.2004, 10:21 |
|
Мастер участка
Группа: Модератор
Сообщений: 545
|
напиши pls поконкретнее для чего... тогда правильный совет дадим!
Отредактировано Konstantine — 08/10/2004, 11:24
|
|