копирование файла

Модератор: Модераторы разделов

warp
Сообщения: 135

копирование файла

Сообщение warp »

вот задался вопросом: а есть ли в стандартной библиотеке с++ (ну или си на худой коней) какая нибудь функция для копирования файла из папки А в папку Б? или это возможно только старым добрыйм wile'ом побитово?
за мировое господство! банзай, товарищи!
Спасибо сказали:
Аватара пользователя
Voice
Сообщения: 1073
Статус: столлманист
ОС: Debian GNU/Linux

Re: копирование файла

Сообщение Voice »

Побайтово ;)

Походу нету...
"И может собственных Платонов и быстрых разумом Невтонов российская земля рождать."
М. В. Ломоносов
Спасибо сказали:
Аватара пользователя
cppmaniac
Сообщения: 9
ОС: Slackware Linux/Gentoo

Re: копирование файла

Сообщение cppmaniac »

в std с++ не предусмотрены средства для работы с файловой системой.
Если нужно берите boost::filesystem;
Спасибо сказали:
Аватара пользователя
BlackStar
Сообщения: 1338
Статус: We are all Kosh
ОС: Fedora 10

Re: копирование файла

Сообщение BlackStar »

man sendfile
LightLang Team
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: копирование файла

Сообщение RasenHerz »

warp писал(а):
21.09.2008 17:40
вот задался вопросом: а есть ли в стандартной библиотеке с++ (ну или си на худой коней) какая нибудь функция для копирования файла из папки А в папку Б? или это возможно только старым добрыйм wile'ом побитово?

ну зачем же побайтово... хорошие результаты показывает копирование блоками по 1024 или 4096 байт. =)
Спасибо сказали:
warp
Сообщения: 135

Re: копирование файла

Сообщение warp »

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: копирование файла

Сообщение pcodr »

Вот моя версия программки которая копирует блоками, только она не на С++ а на С

Код: Выделить всё

#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: копирование файла

Сообщение destr »

Да не выдумывайте, не посмотрели 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

Re: копирование файла

Сообщение pcodr »

А с sendfile() не кроссплатформенно получается :)
remote system type is unix
Спасибо сказали:
warp
Сообщения: 135

Re: копирование файла

Сообщение warp »

А с sendfile() не кроссплатформенно получается smile.gif

именно! вот потому и выдумываю. да и вообще лучше язык (stl сюда включая) учить чем ide и примочки к чему-то, не знаю к чему.
за мировое господство! банзай, товарищи!
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: копирование файла

Сообщение RasenHerz »

было бы класно заставить это заработать, но может быть побалуеш меня примерчиком копированием блоками? канеш, в общих чертах оно у меня есть в голове, но нехвтатает частнойстей чтоб оно просто работало...

вот пример:

Код: Выделить всё

#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

Re: копирование файла

Сообщение BlackStar »

RasenHerz писал(а):
23.09.2008 08:46
оптимальный размер - 4096 для систем с размером страницы в 4кб,

Почему же в примере 1024?
LightLang Team
Спасибо сказали:
Аватара пользователя
кодировщик
Сообщения: 974
Статус: зарёган в пятницу 13
ОС: Linux

Re: копирование файла

Сообщение кодировщик »

BlackStar писал(а):
23.09.2008 10:39
RasenHerz писал(а):
23.09.2008 08:46
оптимальный размер - 4096 для систем с размером страницы в 4кб,

Почему же в примере 1024?

В принципе затраты будут настолько малы, что их не будем ощущать.
Например: при копировании файла 5 Мб при различных LEN
512 0.27с
1024 0.22с
2048 0.19с
4096 0.18с
8192 0.18с
Как было сказано выше 4096 является оптимальным.
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: копирование файла

Сообщение RasenHerz »

Почему 1024?
Просто ради экономии оперативной памяти))
Спасибо сказали:
warp
Сообщения: 135

Re: копирование файла

Сообщение warp »

ух! слова настоящих линуксоидов!
вот ещё один небольшой вопрос: а read и write кросплатформенные или что это (мб сускалы?)?

ps
ха-ха! ещё одно подтверждение человечности лини - перевод из мана 2 write "Фактически, в некоторых глючных реализациях, даже нет гарантии, что для данных было зарезервировано место." xD
за мировое господство! банзай, товарищи!
Спасибо сказали:
warp
Сообщения: 135

Re: копирование файла

Сообщение warp »

а read и write кросплатформенные или что это (мб сускалы?)?

ох ну я косяк! сколько раз зареклся не юзать ide от лукавого гейтса... зато теперь открыл dev-c++ и ненарадуюсь. ;p
всём спасибо и нескончаемая благодарность!
за мировое господство! банзай, товарищи!
Спасибо сказали:
warp
Сообщения: 135

Re: копирование файла

Сообщение warp »

ох... 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: копирование файла

Сообщение RasenHerz »

Попробуй во-первых, открыть на чтение текстовый файл, во-вторых, изменить в коде соответствующую строку на write(1, buffer, shift); посмотри что получиться.
Спасибо сказали:
warp
Сообщения: 135

Re: копирование файла

Сообщение warp »

опять же ничего... в начале дал полные права на запись\чтение обоим файлам - эффекта ноль, вернее те же 1044 байта копируюстся, а дальше никак. если вместо fd_write поставить еденичку то вывод идёт в консоль, но там тоже явно не больше 1044 знаков. ((
за мировое господство! банзай, товарищи!
Спасибо сказали:
MiK13
Сообщения: 1289
ОС: Linux Debian

Re: копирование файла

Сообщение MiK13 »

warp писал(а):
23.09.2008 16:55
ох... winda os после mingw из dev-c++ 4.9.9.2 даёт скопировать только 1044 байта (из мегабайта), делает вторую итерацию wila'a где read возвращает 0, тогда когда под линью самолёт... или мне уже форум OS_зла подыскать?

А какой код 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

Re: копирование файла

Сообщение warp »

уря-я-я! ось зла поверженна!
за мировое господство! банзай, товарищи!
Спасибо сказали: