Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Как скопировать файл?


Автор: phpsc 10.1.2011, 00:12
Как скопировать файл?

умею только через system("cp file file");
но это не подходит =(

Автор: boostcoder 10.1.2011, 00:29
вот: http://forum.try-catch.ru/index.php?topic=204.0

Автор: phpsc 10.1.2011, 01:04
Код

boost::filesystem::copy_file("../index.php","index.php");

при компиляции debian выдает:
Код

error: ‘boost’ has not been declared

что можно сделать чтобы boost работал?

установил apt-get install boost-build, все равно та же ошибка.

Автор: boostcoder 10.1.2011, 01:20
Цитата

apt-get install libboost-dev


но ради единственной функции не стоит привязывать проект к boost ;)

Автор: phpsc 12.1.2011, 18:26
boostcoder, ошибка все равно появляется...

Нужно еще в include записать...но как? подскажите пожалуйста...

Автор: phpsc 12.1.2011, 20:13
Код

#include<boost/filesystem.hpp>

но теперь выдает следующее:
Код

/tmp/ccCw3iWD.o: In function `boost::enable_if<boost::filesystem::is_basic_path<boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> >, void>::type boost::filesystem::copy_file<boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> >(boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> const&, boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> const&)':
daemon.cpp:(.text._ZN5boost10filesystem9copy_fileINS0_10basic_pathISsNS0_11path_traitsEEEEENS_9enable_ifINS0_13is_basic_pathIT_EEvE4typeERKS7_SC_[boost::enable_if<boost::filesystem::is_basic_path<boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> >, void>::type boost::filesystem::copy_file<boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> >(boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> const&, boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> const&)]+0x40): undefined reference to `boost::filesystem::detail::copy_file_api(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
collect2: ld returned 1 exit status



Автор: boostcoder 12.1.2011, 20:16
Цитата

-lboost_filesystem

Автор: panter 12.1.2011, 20:19
Ну вы извращенцы, ради такого буст тянуть. Вы еще Кьют притяните. 
Функция копирования файла пишется минут 5.

Автор: boostcoder 12.1.2011, 20:30
Цитата(panter @  12.1.2011,  20:19 Найти цитируемый пост)
Функция копирования файла пишется минут 5.

зОчем? smile 
она уже написана. вот только ТС`у хочется тащить за собой буст smile 

Автор: phpsc 12.1.2011, 21:29
В начале boostcoder дал лучшее решение
очередной велосипед.
Код: c++
Код

#include <fstream>
#include <string>
#include <stdexcept>

void copy_file(const std::string& src, const std::string& dst) {
   std::ifstream in(src.c_str(), std::ios::binary);
   if ( !in ) {
      throw std::runtime_error("can`t open file: " + src);
   }
   std::ofstream out(dst.c_str(), std::ios::binary|std::ios::trunc);
   if ( !out ) {
      throw std::runtime_error("can`t create file: " + dst);
   }
   out << in.rdbuf();
}

int main(int argc, const char** argv)  {
   try {
      copy_file("infile.dat", "outfile.dat");
   } catch (const std::exception& e) {
      std::cout << e.what() << std::endl;
   }

   return 0;
}
http://forum.try-catch.ru/index.php?topic=204.0

С boost плохо, т.к. нужно еще будет устанавливать его там где программа будет запускаться.

Автор: borisbn 13.1.2011, 01:17
Цитата(phpsc @  12.1.2011,  21:29 Найти цитируемый пост)
С boost плохо, т.к. нужно еще будет устанавливать его там где программа будет запускаться.

первый раз слышу. proff-link, please

Автор: boostcoder 13.1.2011, 01:20
Цитата(borisbn @  13.1.2011,  01:17 Найти цитируемый пост)
первый раз слышу.

при динамической линковке - да.
но существует статическая линковка. но все равно не нужно тащить в проект слона ;)

Автор: phpsc 13.1.2011, 01:51
а я даже не знал что есть динамическая и статические линковки..я скомпилил...попробовал запустить....затребовал установку boost .. пришлось отказать в пользу "велосипеда" )

Автор: borisbn 13.1.2011, 08:56
boostcoder, а при динамической линковке нельзя просто подкинуть нужные библиотеки к программе, как в windows'е ? 

Автор: panter 13.1.2011, 10:02
borisbn, в Линуксе это сложнее. Да и распространять проги в Линуксе принято другим способом.

Автор: Alca 13.1.2011, 10:35
Цитата

В начале boostcoder дал лучшее решение
очередной велосипед.

И будет работать, если в пути есть русские буквы?

http://forum.vingrad.ru/forum/topic-319984/anchor-entry2281620/0.html

Автор: TimberWolf 13.1.2011, 20:03
Цитата(phpsc @ 10.1.2011,  00:12)
Как скопировать файл?

Для данной задачи существует масса решений. Можно, конечно, и boost притащить или использовать mmap...  smile 
Я бы решал эту задачу используя библиотечные функции fread, fwrite, feof. Их описание легко находится в google. Они предоставляют буферизированный ввод-вывод. Также, можно использовать fflush для сброса буферов.

Автор: boostcoder 13.1.2011, 20:09
Цитата(Alca @  13.1.2011,  10:35 Найти цитируемый пост)
И будет работать, если в пути есть русские буквы?

а в чем разница?

Автор: Alca 14.1.2011, 00:57
Цитата

а в чем разница?

 а ты попробуй на винде с рууским, без установки локали

Автор: TimberWolf 16.1.2011, 00:01
Код

#include <stdio.h>
#include <stdlib.h>

#define BUFSIZE 256

int main(int argc, char *argv[]) {
    FILE *in, *out;
    char buf[BUFSIZE];
    size_t bt = 0;
    if((in = fopen(argv[1], "r")) == NULL) {
        perror("fopen in");
        exit(1);
    }
    if((out = fopen(argv[2], "w")) == NULL) {
        perror("fopen out");
        exit(1);
    }
    while(!feof(in)) {
        bt = fread(buf, sizeof(char), BUFSIZE, in);
        if(ferror(in)) {
            printf("fread error");
            exit(1);
        }
        fwrite(buf, sizeof(char), bt, out);
        if(ferror(out)) {
            printf("fwrite error");
            exit(1);
        }
    }
    return 0;
}

Размер буфура необходимо подбирать под конкретную систему. Обычно слишком маленький буфер снижает производительность, а слишком большой сжирает память.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)