Поиск:

Ответ в темуСоздание новой темы Создание опроса
> CreateDirectory and FindFirstFile 
:(
    Опции темы
torero
Дата 22.2.2008, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 177
Регистрация: 1.2.2006

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



  У меня получилось два вопроса по одной теме.
  1. Я использую выражение  if(!CreateDirectory(puthto,NULL)) { ... }  Но ошибка создания появляется
  и в том случае, если puthto уже существует и в него можно копировать файлы. Может быть есть метод,
  чтобы определить, существует заданный puthto или нет. 
  2. Далее, для копирования всех файлов, я использую связку:
        hSearch=FindFirstFile(puthoff,&FileData); ... if(!FindNextFile(hSearch,&FileData)), где puthoff
   задаю так:  ...путь...\\*.*   Но такое выражение не проходит. На конце можно только ставить
   или  \\*.cpp (например) или \\Setup.* , т.е. идёт поиск файлов или одного расширения или одного имени.
   Можно, конечно, цикл сделать по всем расширениям, но может быть можно задать поиск всех файлов? 

PM MAIL   Вверх
Fazil6
Дата 22.2.2008, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 3
Всего: 60



Цитата(torero @  22.2.2008,  19:35 Найти цитируемый пост)
задаю так:  ...путь...\\*.*   Но такое выражение не проходит. На конце можно только ставить   или  \\*.cpp (например) или \\Setup.* , т.е. идёт поиск файлов или одного расширения или одного имени.   Можно, конечно, цикл сделать по всем расширениям, но может быть можно задать поиск всех файлов? 


 ...путь...\\* 

Добавлено @ 21:32
Цитата(torero @  22.2.2008,  19:35 Найти цитируемый пост)
1. Я использую выражение  if(!CreateDirectory(puthto,NULL)) { ... }  Но ошибка создания появляется  и в том случае, если puthto уже существует и в него можно копировать файлы. Может быть есть метод,  чтобы определить, существует заданный puthto или нет. 


Код


#include <boost/filesystem/operations.hpp>

enum {DIR_EXIST, DIR_NOT_CREATE, DIR_CREATE };

namespace CREATEDIRECTORY
{

    using namespace boost::filesystem;
    int CreateDirectory(path p)
    {

        if(p.empty())
        {
            return DIR_NOT_CREATE;
        }

        if(exists( p.branch_path() ))
        {
            if( create_directory(p) )
                return DIR_CREATE;
            else
                return DIR_NOT_CREATE;
        }
        else
        {
            int r = CreateDirectory( p.branch_path() );
            if (r == DIR_CREATE)
                return CreateDirectory(p);
            else
                return r;
        }

    }
} // end namespace

//===================================
// проверка существования пути в фс
bool dir_exist(const char *_path) 
{
    using namespace boost::filesystem;
    return exists(    path(_path, native) );    
}
//===================================
// создание пути в фс
int  dir_create(const char *_path)
{
    using namespace boost::filesystem;

    path p(_path, native);
    
    if(exists(p))
    {
        return DIR_EXIST;
    }

    return CREATEDIRECTORY::CreateDirectory(p);
    
}
//===================================




Это сообщение отредактировал(а) Fazil6 - 22.2.2008, 21:35
PM MAIL   Вверх
BorisVorontsov
Дата 22.2.2008, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Thinker
**


Профиль
Группа: Комодератор
Сообщений: 714
Регистрация: 3.11.2005
Где: Молдавия, г. Киши нёв

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



1. PathFileExists
2. А так "Путь\\*"?



--------------------
[code=cpp]
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;
[/code]
PM MAIL ICQ GTalk   Вверх
torero
Дата 25.2.2008, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 177
Регистрация: 1.2.2006

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



   По вопросу 1- результат получился методом  PathFileExists , спасибо.
   А ответ Fazil6 не понял, это видимо другая платформа, объясни, пожалуйста, как этим пользоваться и
  где прочитать.
   По вопросу 2- ...путь...\\* даёт тот же результат, что и ...путь...\\*.*  т.е.
  FindFirstFile(puthoff,&FileData); определяет FileData.cFileName=.  (имя, как точка). Я бы подумал, что 
  неправильно формирую puthoff, но, если пишу ...путь...\\*.срр , то получается правильно.Что делать?

PM MAIL   Вверх
BorisVorontsov
Дата 25.2.2008, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Thinker
**


Профиль
Группа: Комодератор
Сообщений: 714
Регистрация: 3.11.2005
Где: Молдавия, г. Киши нёв

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



Цитата(torero @  25.2.2008,  20:02 Найти цитируемый пост)
По вопросу 2- ...путь...\\* даёт тот же результат, что и ...путь...\\*.*  т.е.  FindFirstFile(puthoff,&FileData); определяет FileData.cFileName=.  (имя, как точка).


Показывай код.
Этот код у меня работает как положено:

Код

    WIN32_FIND_DATA WFD = { 0 };
    HANDLE hFind = FindFirstFile("C:\\Windows\\*", &WFD);
    do
    {
        cout<<WFD.cFileName<<"\t"<<WFD.cAlternateFileName<<endl;
    } while (FindNextFile(hFind, &WFD));
    FindClose(hFind);



--------------------
[code=cpp]
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;
[/code]
PM MAIL ICQ GTalk   Вверх
torero
Дата 26.2.2008, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 177
Регистрация: 1.2.2006

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



Код

  WIN32_FIND_DATA FileData;
  HANDLE hSearch;
  LPTSTR puthoff;
  TCHAR Buffof[100];
  puthoff=Buffof;
  GetCurrentDirectory(dld,puthoff);TRACE("puthoff=%s\n",puthoff);  //вывод-puthoff=C:\VISUAL\DEMO\Setup
  strcat(puthoff,"\\*");TRACE("puthoff=%s\n",puthoff);             //      puthoff=dirof=C:\VISUAL\DEMO\Setup\*
  hSearch=FindFirstFile(puthoff,&FileData);TRACE("FileData.cFileName=%s\n",FileData.cFileName);
                                                                             //вывод-FileData.cFileName=.  


Это сообщение отредактировал(а) torero - 26.2.2008, 19:54
PM MAIL   Вверх
BorisVorontsov
Дата 26.2.2008, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Thinker
**


Профиль
Группа: Комодератор
Сообщений: 714
Регистрация: 3.11.2005
Где: Молдавия, г. Киши нёв

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



И? Не вижу вызова FindNextFile.

Добавлено через 43 секунды
Кстати, приучись занулять структуры и массивы перед использованием.


--------------------
[code=cpp]
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;
[/code]
PM MAIL ICQ GTalk   Вверх
torero
Дата 27.2.2008, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 177
Регистрация: 1.2.2006

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



 FindNextFile идёт дальше, ошибка уже в том, что FileData.cFileName=. (точке), но я понял в чём дело.
  Я создал проект Setup и запустил его на выполнение, т.е. он должен скопировать сам себя.
  А в проекте что идёт вначале, сверху вниз? Две точки, директория Debug, директория Res и затем все файлы.
  Вот, когда я обошёл при помощи, например, if(strcmp(FileData.cFileName,"Debug")==0 ) 
  точки и поддиректории, то файлы скопировались все. И тогда работают и "\\*" и"\\*.*" 
  Вобщем я понял так. Сделать универсальную программу для копирования составной директории не получится.
  Ну, две точки, допустим, есть везде, но поддиректории в каждом проекте разные. Значит, всё это нужно анализи-
  ровать и поддиректории создавать и копировать отдельно. Получится оригинальная программа.
  Если я ошибаюсь, поправьте меня, пожалуйста.

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


Thinker
**


Профиль
Группа: Комодератор
Сообщений: 714
Регистрация: 3.11.2005
Где: Молдавия, г. Киши нёв

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



Цитата(torero @  27.2.2008,  14:19 Найти цитируемый пост)
 ошибка уже в том, что FileData.cFileName=. (точке)


Какая же это ошибка?

Цитата(torero @  27.2.2008,  14:19 Найти цитируемый пост)
Сделать универсальную программу для копирования составной директории не получится.


Ты слышал когда-нибудь про рекурсивный поиск? Вот это оно.

Цитата(torero @  27.2.2008,  14:19 Найти цитируемый пост)
Если я ошибаюсь, поправьте меня, пожалуйста.


Ничего анализировать и копировать отдельно не нужно. См. выше. Поиск (форум, google) -- твой друг.



--------------------
[code=cpp]
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;
[/code]
PM MAIL ICQ GTalk   Вверх
torero
Дата 28.2.2008, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 177
Регистрация: 1.2.2006

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



  Согласен. Я уже понял, что ошибался. Совсем универсальную программу писать долго и она мне
не нужна, но для своих программ инсталляцию с СD RW уже делаю. Спасибо за советы.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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