Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с файлами (из Windows на UNIX) 
V
    Опции темы
Ak47black
  Дата 12.9.2010, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



Здравствуйте.
Помогите пожалуйста переделать следующий код на UNIX
Есть модуль
filesfunc.h
Код

//---------------------------------------------------------------------------

#ifndef filesfuncH
#define filesfuncH

#include <string>
#include <vector>

void getFiles(string path, vector<string>& s); //Функция возвращает информацию о файлах в заданном каталоге
unsigned int ReadBlock(char * filename, unsigned int offset, char * buffer, int len); //функция считывает n байтов из файла
void WriteBlock(char * filename, unsigned int offset, char * buffer, int len); //функция записывает блок из n байтов в файл
void GetSize(char * filename, char* dest); //Функция получает и записывает размер файла в буфер

#endif


filesfunc.cpp
Код

//---------------------------------------------------------------------------
#include "filesfunc.h"
//---------------------------------------------------------------------------

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

void getFiles(string path, vector<string>& s)
{
   WIN32_FIND_DATA FindFileData;
    HANDLE hFind;
    path += "*.*";
    hFind = FindFirstFile(path.c_str(), &FindFileData);
    if (hFind == INVALID_HANDLE_VALUE)
    {
        s.push_back("Error. Getting files list.\n");
        return;
    };

    char str[255];
    char type[4];
    do
    {
        if (FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY) continue;
        SYSTEMTIME Time;
        FileTimeToSystemTime(&FindFileData.ftLastWriteTime, &Time);

        sprintf(str, "%02d/%02d/%d %02d:%02d %10I64uk\t %s\n",
                            Time.wMonth, Time.wDay, Time.wYear,
                            Time.wHour, Time.wMinute,
                            FindFileData.nFileSizeHigh*4294967296+FindFileData.nFileSizeLow,
                            FindFileData.cFileName );
        s.push_back(str);
        memset(str, 0, 255);
    }
    while (FindNextFile(hFind, &FindFileData) != 0);
    FindClose(hFind);
}

unsigned int ReadBlock(char * filename, unsigned int offset, char * buffer, int len)
{
    FILE *f = fopen(filename, "rb");
    if (f == NULL)
    {
        fclose(f);
        return 0;
    }
    fseek(f, offset, SEEK_SET);
    unsigned int size = fread((char*)buffer, 1, len, f);
    fclose(f);
    return size;
}

void WriteBlock(char * filename, unsigned int offset, char * buffer, int len)
{
    FILE *f = fopen(filename, "ab");
    if (f == NULL)
    {
      fclose(f);
        FILE *f = fopen(filename, "wb");
        if (f == NULL)
        {
            printf("Error writing to file. number - %d.\n", GetLastError());
            fclose(f);
            exit(1);
        }
    }
    fwrite((char*)buffer, 1, len, f);
    fclose(f);
}

void GetSize(char * filename, char* dest)
{
    WIN32_FIND_DATA FindFileData;
    HANDLE hFind;
    hFind = FindFirstFile(filename, &FindFileData);
    if (hFind == INVALID_HANDLE_VALUE)
    {
        FindFileData.nFileSizeLow = 0;
    }
    memcpy(dest, &FindFileData.nFileSizeLow, 4);
   FindClose(hFind);
}


Пробую скомпилировать 
Цитата

g++ filesfunc.cpp
 и вижу
Цитата

filesfunc.cpp:39: error: integer constant is too large for Б─≤longБ─≥ type
filesfunc.cpp:16: error: variable or field Б─≤getFilesБ─≥ declared void
filesfunc.cpp:16: error: Б─≤stringБ─≥ was not declared in this scope
filesfunc.cpp:16: error: Б─≤vectorБ─≥ was not declared in this scope
filesfunc.cpp:16: error: Б─≤stringБ─≥ was not declared in this scope
filesfunc.cpp:16: error: Б─≤sБ─≥ was not declared in this scope


Немогу понять в чём проблема на 16 строке? (Вроде-бы я всё нормально объявил.)
И как тут дальше быть? Какими функциями мне лучше воспользоваться?


Это сообщение отредактировал(а) Ak47black - 12.9.2010, 14:44
PM MAIL   Вверх
boostcoder
Дата 12.9.2010, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



Цитата(Ak47black @  12.9.2010,  14:28 Найти цитируемый пост)
Пробую скомпилировать 

зря.
код написан с использованием WINAPI. нужно переписывать.

ща...

Добавлено через 52 секунды
Цитата(Ak47black @  12.9.2010,  14:28 Найти цитируемый пост)
на UNIX

какой дистр?
PM WWW   Вверх
Ak47black
Дата 12.9.2010, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



Цитата

Debian GNU/Linux

PM MAIL   Вверх
boostcoder
Дата 12.9.2010, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



Цитата(Ak47black @  12.9.2010,  14:28 Найти цитируемый пост)
void GetSize(char * filename, char* dest)

что-то я не въезжаю... почему у вас целое копируется в указатель на char?
PM WWW   Вверх
Ak47black
Дата 12.9.2010, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



Эээ тут у меня подаётся указатель куда нужно скопировать само значение величины файла.
(У меня программа клент-сервер и тут я подаю указатель на буфер со смешением)
Ну вроде сильных выкрутасов нету. Наверное Вам просто показался странным этот аргумент  smile

Добавлено @ 15:59
А char, потому-что я так буфер в другом файле объявил.

Добавлено через 3 минуты и 23 секунды
Вы знаете как-то никак не пойму что именно не нравится компилятору на 16 строке. Хотя в принципе тут и код сам на winapi, но почему он заголовок не пропускает?

Это сообщение отредактировал(а) Ak47black - 12.9.2010, 15:59
PM MAIL   Вверх
boostcoder
Дата 12.9.2010, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



понятно.
значит вот:
Код

#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <stdexcept>
#include <boost/filesystem.hpp>
#include <boost/format.hpp>

struct path_inserter {
   path_inserter(std::vector<std::string>& s):_svec(s) {}
   void operator() (const boost::filesystem::path& p) {
      // тут нужно отформатировать строку перед вставкой в вектор
      // я хз что та вендовая функция делает, и чем ее можно заменить
      _svec.push_back(p.string());
   }
private:
   std::vector<std::string>& _svec;
};

void getFiles(const std::string& path, std::vector<std::string>& s) {
   boost::filesystem::directory_iterator beg(path), end;
   std::for_each(beg, end, path_inserter(s));
}

unsigned int ReadBlock(char * filename, unsigned int offset, char * buffer, int len) {
   std::ifstream file(filename, std::ios::in|std::ios::binary);
   if ( !file ) { return 0; }
   file.seekg(offset, std::ios::beg);
   file.read(buffer, len);
   return file.gcount();
}

void WriteBlock(char * filename, unsigned int offset, char * buffer, int len) {
   {  std::ofstream file(filename, std::ios::app);
      if ( !file ) {
         std::ofstream file(filename, std::ios::out);
         if ( !file ) { throw std::runtime_error("can`t create file for writing!"); }
      }
   }
   std::ofstream file(filename, std::ios::app|std::ios::binary);
   if ( !file ) { throw std::runtime_error("can`t open file for writing!"); }
   file.write(buffer, len);
}

void GetSize(char * filename, char* dest) {
   *((unsigned int*)dest) = (unsigned int)boost::filesystem::file_size(filename);
}


в комментах видно чего я не сделал. что-то не могу понять из доки по FileTimeToSystemTime() что он делает smile
код будет работать во всех ОС.
предварительно, в Debian, в консоле, выполните:
Цитата

sudo apt-get install libboost-all-dev


Добавлено через 2 минуты и 43 секунды
в нынешней реализации getFiles(), в вектор будут вставляться только имена файлов.
PM WWW   Вверх
Ak47black
Дата 12.9.2010, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



Цитата(boostcoder @  12.9.2010,  16:04 Найти цитируемый пост)
sudo apt-get install libboost-all-dev

Я через telnet компилирую на сервере университета и помоему мне это не удастся.

Теперь я при компиляции 
Цитата

g++ filesfunc.cpp
получаю
Цитата

filesfunc.cpp:6:32: error: boost/filesystem.hpp: No such file or directory
filesfunc.cpp:7:28: error: boost/format.hpp: No such file or directory
filesfunc.cpp:11: error: expected Б─≤,Б─≥ or Б─≤...Б─≥ before Б─≤::Б─≥ token
filesfunc.cpp:11: error: ISO C++ forbids declaration of Б─≤boostБ─≥ with no type
filesfunc.cpp: In member function Б─≤void path_inserter::operator()(int)Б─≥:
filesfunc.cpp:14: error: Б─≤pБ─≥ was not declared in this scope
filesfunc.cpp: In function Б─≤void getFiles(const std::string&, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&)Б─≥:
filesfunc.cpp:20: error: Б─≤boostБ─≥ has not been declared
filesfunc.cpp:20: error: expected `;' before Б─≤begБ─≥
filesfunc.cpp:21: error: Б─≤for_eachБ─≥ is not a member of Б─≤stdБ─≥
filesfunc.cpp:21: error: Б─≤begБ─≥ was not declared in this scope
filesfunc.cpp:21: error: Б─≤endБ─≥ was not declared in this scope
filesfunc.cpp: In function Б─≤void GetSize(char*, char*)Б─≥:
filesfunc.cpp:42: error: Б─≤boostБ─≥ was not declared in this scope
filesfunc.cpp:42: error: expected `;' before Б─≤::Б─≥ token



Это сообщение отредактировал(а) Ak47black - 12.9.2010, 16:30
PM MAIL   Вверх
boostcoder
Дата 12.9.2010, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



Цитата(boostcoder @  12.9.2010,  16:04 Найти цитируемый пост)
предварительно, в Debian, в консоле, выполните:
Цитата

sudo apt-get install libboost-all-dev



PM WWW   Вверх
Ak47black
Дата 12.9.2010, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



Цитата(boostcoder @  12.9.2010,  16:04 Найти цитируемый пост)
FileTimeToSystemTime() что он делает smile

Эта функция перевод из одного формата времени в другой.

Добавлено @ 16:36
Цитата(boostcoder @ 12.9.2010,  16:30)
Цитата(boostcoder @  12.9.2010,  16:04 Найти цитируемый пост)
предварительно, в Debian, в консоле, выполните:
Цитата

sudo apt-get install libboost-all-dev


А что эта команда делает?
Я просто не имею прав администратора. А по другому без этого никак нельзя?

Добавлено через 6 минут и 36 секунд
Цитата(boostcoder @  12.9.2010,  16:04 Найти цитируемый пост)
код будет работать во всех ОС

Мнеб только на данный момент нужно хотя-бы на UNIX запустить всё это дело  smile 

Это сообщение отредактировал(а) Ak47black - 12.9.2010, 16:38
PM MAIL   Вверх
boostcoder
Дата 12.9.2010, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



Цитата(Ak47black @  12.9.2010,  16:34 Найти цитируемый пост)
А что эта команда делает?

устанавливает библиотеки boost.

Цитата(Ak47black @  12.9.2010,  16:34 Найти цитируемый пост)
Я просто не имею прав администратора. А по другому без этого никак нельзя?

нужно код переписать smile

Добавлено через 10 минут и 54 секунды
вот:
Код

#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <stdexcept>
#include <dirent.h>
#include <sys/stat.h>

void getFiles(const std::string& path, std::vector<std::string>& s) {
   DIR* dir = opendir(path.c_str());
   if ( !dir ) { throw std::runtime_error("can`t open dir!"); }
   for ( dirent* cur = readdir(dir); cur; cur = readdir(dir) ) {
      s.push_back(path + "/" + cur->d_name);
   }
   closedir(dir);
}

unsigned int ReadBlock(char * filename, unsigned int offset, char * buffer, int len) {
   std::ifstream file(filename, std::ios::in|std::ios::binary);
   if ( !file ) { return 0; }
   file.seekg(offset, std::ios::beg);
   file.read(buffer, len);
   return file.gcount();
}

void WriteBlock(char * filename, unsigned int offset, char * buffer, int len) {
   {  std::ofstream file(filename, std::ios::app);
      if ( !file ) {
         std::ofstream file(filename, std::ios::out);
         if ( !file ) { throw std::runtime_error("can`t create file for writing!"); }
      }
   }
   std::ofstream file(filename, std::ios::app|std::ios::binary);
   if ( !file ) { throw std::runtime_error("can`t open file for writing!"); }
   file.write(buffer, len);
}

void GetSize(char * filename, char* dest) {
   struct stat st = {0};
   if ( stat(filename, &st) ) { throw std::runtime_error("can`t stat for file!"); }
   *((unsigned int*)dest) = (unsigned int)st.st_size;
}


PM WWW   Вверх
boostcoder
Дата 12.9.2010, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



up:
Код

void getFiles(const std::string& path, std::vector<std::string>& s) {
   DIR* dir = opendir(path.c_str());
   if ( !dir ) { throw std::runtime_error("can`t open dir!"); }
   for ( dirent* cur = readdir(dir); cur; cur = readdir(dir) ) {
      std::string filename = path + "/" + cur->d_name;
      struct stat st;
      if ( stat(filename.c_str(), &st) ) { throw std::runtime_error("can`t stat for file!"); }
      if ( S_ISDIR(st.st_mode) ) continue;
      s.push_back(filename);
   }
   closedir(dir);
}


PM WWW   Вверх
Ak47black
Дата 12.9.2010, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



.....

Это сообщение отредактировал(а) Ak47black - 12.9.2010, 17:33
PM MAIL   Вверх
boostcoder
Дата 12.9.2010, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



гм smile 
у меня все компилиться.

Цитата(Ak47black @  12.9.2010,  17:25 Найти цитируемый пост)
filesfunc.h:6

у вас это какая строка?

Цитата(Ak47black @  12.9.2010,  17:25 Найти цитируемый пост)
g++ filesfunc.h

.h файлы не компилируются по отдельности.

версию компилятора покажите.
PM WWW   Вверх
Ak47black
Дата 12.9.2010, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



ПАРДОН! Работает! (хотя всё не проверил, но хотя-бы запустил)
Запутался просто уже во всём этом. А без Вас я бы тут долго ещё сидел! Спасибо Вам огромное! +
Сейчас буду дальше идти, но хотябы я запустил  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.1079 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.