копирование файла
Модератор: Модераторы разделов
-
warp
- Сообщения: 135
копирование файла
вот задался вопросом: а есть ли в стандартной библиотеке с++ (ну или си на худой коней) какая нибудь функция для копирования файла из папки А в папку Б? или это возможно только старым добрыйм wile'ом побитово?
за мировое господство! банзай, товарищи!
-
Voice
- Сообщения: 1073
- Статус: столлманист
- ОС: Debian GNU/Linux
Re: копирование файла
Побайтово 
Походу нету...
Походу нету...
"И может собственных Платонов и быстрых разумом Невтонов российская земля рождать."
М. В. Ломоносов
М. В. Ломоносов
-
cppmaniac
- Сообщения: 9
- ОС: Slackware Linux/Gentoo
Re: копирование файла
в std с++ не предусмотрены средства для работы с файловой системой.
Если нужно берите boost::filesystem;
Если нужно берите boost::filesystem;
-
BlackStar
- Сообщения: 1338
- Статус: We are all Kosh
- ОС: Fedora 10
-
RasenHerz
- Сообщения: 1341
- ОС: Arch Linux amd64
Re: копирование файла
ну зачем же побайтово... хорошие результаты показывает копирование блоками по 1024 или 4096 байт. =)
-
warp
- Сообщения: 135
Re: копирование файла
RasenHerz, я вот пока пытаюсь разобратся с побайтовым. пытаюсь понять чего у меня получаеться отдельно писать и отдельно читать из файла, но никак не выходит и то и другое вместе и одним циклом. вот пока размышляю над этим:
было бы класно заставить это заработать, но может быть побалуеш меня примерчиком копированием блоками? канеш, в общих чертах оно у меня есть в голове, но нехвтатает частнойстей чтоб оно просто работало...
Код: Выделить всё
#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
int main()
{
ifstream outputFile("main.txt", ios::in);
ifstream inputFile("slave.txt", ios::out);
char sumbol;
while (! outputFile.eof())
{
outputFile >> sumbol;
//cout << sumbol;
inputFile << sumbol;
}
return 0;
}было бы класно заставить это заработать, но может быть побалуеш меня примерчиком копированием блоками? канеш, в общих чертах оно у меня есть в голове, но нехвтатает частнойстей чтоб оно просто работало...
за мировое господство! банзай, товарищи!
-
pcodr
- Сообщения: 283
- ОС: Debian
Re: копирование файла
Вот моя версия программки которая копирует блоками, только она не на С++ а на С
Код: Выделить всё
#include <stdio.h>
#include <stdlib.h>
#define BLOCK 35654
int die(char *msg)
{
puts(msg);
exit(1);
return 0;
}
int main(int argc, char *argv[])
{
FILE *from, *to;
char buffer[BLOCK];
int readed;
if(argc==3)
{
(from=fopen(argv[1], "r")) || die("file_from could not be opened");
(to =fopen(argv[2], "w")) || die("file_to could not be opened");
while(!feof(from))
{
readed=fread(buffer, sizeof(char), BLOCK, from);
(fwrite(buffer, sizeof(char), readed, to)==readed) || die("failed writing data to the file");
}
fclose(from);
fclose(to);
}
else die("usage: file_from file_to");
return 0;
}remote system type is unix
-
destr
- Сообщения: 128
- ОС: Debian
Re: копирование файла
Да не выдумывайте, не посмотрели sendfile
sendfile() copies data between one file descriptor and another. Because this copying is done within the kernel, send‐
file() is more efficient than the combination of read(2) and write(2), which would require transferring data to and
from user space.
-
pcodr
- Сообщения: 283
- ОС: Debian
-
warp
- Сообщения: 135
Re: копирование файла
А с sendfile() не кроссплатформенно получается smile.gif
именно! вот потому и выдумываю. да и вообще лучше язык (stl сюда включая) учить чем ide и примочки к чему-то, не знаю к чему.
за мировое господство! банзай, товарищи!
-
RasenHerz
- Сообщения: 1341
- ОС: Arch Linux amd64
Re: копирование файла
было бы класно заставить это заработать, но может быть побалуеш меня примерчиком копированием блоками? канеш, в общих чертах оно у меня есть в голове, но нехвтатает частнойстей чтоб оно просто работало...
вот пример:
Код: Выделить всё
#include <fcntl.h>
#include <stdio.h>
#define LEN 1024
int main(int argc, char *argv[]){
int fd;
char *buffer;
fd = open("file.txt", O_RDWR); // открываем файл на чение-запись
if(fd<0) // ошибка открытия
exit(1);
buffer = (char*)malloc(LEN); // выделяем память под буффер
if(!buffer){
close(fd);
exit(1);
}
while(read(fd, buffer, LEN) > 0){// считываем в буффер блоки данных размером LEN
//....
//тут что-то делаем с буффером =)
//....
}
free(buffer); //освобождаем буффер
close(fd); // закрываем файловый дескриптор
return 0;
}#define BLOCK 35654
Что-то многовато для одного блока). оптимальный размер - 4096 для систем с размером страницы в 4кб, и 8192 для систем с размером страницы в 8кб.
-
BlackStar
- Сообщения: 1338
- Статус: We are all Kosh
- ОС: Fedora 10
-
кодировщик
- Сообщения: 974
- Статус: зарёган в пятницу 13
- ОС: Linux
Re: копирование файла
В принципе затраты будут настолько малы, что их не будем ощущать.
Например: при копировании файла 5 Мб при различных LEN
512 0.27с
1024 0.22с
2048 0.19с
4096 0.18с
8192 0.18с
Как было сказано выше 4096 является оптимальным.
-
RasenHerz
- Сообщения: 1341
- ОС: Arch Linux amd64
Re: копирование файла
Почему 1024?
Просто ради экономии оперативной памяти))
Просто ради экономии оперативной памяти))
-
warp
- Сообщения: 135
Re: копирование файла
ух! слова настоящих линуксоидов!
вот ещё один небольшой вопрос: а read и write кросплатформенные или что это (мб сускалы?)?
ps
ха-ха! ещё одно подтверждение человечности лини - перевод из мана 2 write "Фактически, в некоторых глючных реализациях, даже нет гарантии, что для данных было зарезервировано место." xD
вот ещё один небольшой вопрос: а read и write кросплатформенные или что это (мб сускалы?)?
ps
ха-ха! ещё одно подтверждение человечности лини - перевод из мана 2 write "Фактически, в некоторых глючных реализациях, даже нет гарантии, что для данных было зарезервировано место." xD
за мировое господство! банзай, товарищи!
-
warp
- Сообщения: 135
Re: копирование файла
а read и write кросплатформенные или что это (мб сускалы?)?
ох ну я косяк! сколько раз зареклся не юзать ide от лукавого гейтса... зато теперь открыл dev-c++ и ненарадуюсь. ;p
всём спасибо и нескончаемая благодарность!
за мировое господство! банзай, товарищи!
-
warp
- Сообщения: 135
Re: копирование файла
ох... winda os после mingw из dev-c++ 4.9.9.2 даёт скопировать только 1044 байта (из мегабайта), делает вторую итерацию wila'a где read возвращает 0, тогда когда под линью самолёт... или мне уже форум OS_зла подыскать?
Код: Выделить всё
#include <iostream>
#include <fcntl.h>
int main(){
int fd_read = open("NTDETECT.COM", O_RDONLY);
//cout << "fd_read: " << fd_read << endl;
int fd_write = open("_NTDETECT.COM", O_WRONLY | O_CREAT);
//cout << "fd_write: " << fd_write << endl;
if ((fd_read < 0) || (fd_write < 0))
return 1;
char *buffer = new char[4096];
if (!buffer){
close(fd_read);
close(fd_write);
return 0;
}
//int readed;
int shift = 0;
while((shift = read(fd_read, buffer, 4096)) > 0){
write(fd_write, buffer, shift);
}
delete buffer;
close(fd_read);
close(fd_write);
return 0;
}за мировое господство! банзай, товарищи!
-
RasenHerz
- Сообщения: 1341
- ОС: Arch Linux amd64
Re: копирование файла
Попробуй во-первых, открыть на чтение текстовый файл, во-вторых, изменить в коде соответствующую строку на write(1, buffer, shift); посмотри что получиться.
-
warp
- Сообщения: 135
Re: копирование файла
опять же ничего... в начале дал полные права на запись\чтение обоим файлам - эффекта ноль, вернее те же 1044 байта копируюстся, а дальше никак. если вместо fd_write поставить еденичку то вывод идёт в консоль, но там тоже явно не больше 1044 знаков. ((
за мировое господство! банзай, товарищи!
-
MiK13
- Сообщения: 1289
- ОС: Linux Debian
Re: копирование файла
А какой код 1045-го байта? Не 26 ('z'&31) ?
Может быть стоит открывать файл по
Код: Выделить всё
int fd_read = open("NTDETECT.COM", O_RDONLY | O_BINARY);
int fd_write = open("_NTDETECT.COM", O_WRONLY | O_CREAT | O_BINARY);Кстати, в Linux, при создании файла (флаг O_CREAT) желательно указывать 3-й параметр -- режим доступа к файлу
-
warp
- Сообщения: 135