Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Операции над файлами, SHFileOperation 
:(
    Опции темы
ChihPih
Дата 28.8.2007, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 532
Регистрация: 3.12.2006

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



Привет всем!
Проблема в следующем: иногда при использовании функции(ниже приведенной) выскакивает ошибка "Системе не удается найти указанный файл...", а иногда не выскакивает! В чем проблема?

bool WINAPI ProcFiles(HANDLE Handle, UINT Operation, char *Data, char *Dest)
{
  TSHFileOpStruct sh;
  bool check = false;

  sh.hwnd = Handle;
  sh.wFunc = Operation;
  sh.pFrom = Data,"\0";
  if (Dest == ""){ sh.pTo = NULL; }
  else { sh.pTo = Dest,"\0"; }
  sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT;
  sh.hNameMappings = 0;
  sh.lpszProgressTitle = NULL;
  if (SHFileOperation(&sh) == 0){ check = true; }
  return check;
}



--------------------
www.info-x.org - информационный ресурс о ОС FreeBSD. Форум.
PM MAIL WWW Jabber   Вверх
586
Дата 28.8.2007, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(ChihPih @  28.8.2007,  21:08 Найти цитируемый пост)
sh.pFrom = Data,"\0";

   ???  smile 
Цитата(ChihPih @  28.8.2007,  21:08 Найти цитируемый пост)
bool WINAPI ProcFiles(HANDLE Handle, UINT Operation, char *Data, char *Dest)

Цитата(ChihPih @  28.8.2007,  21:08 Найти цитируемый пост)
 if (Dest == "")

Это равенство всегда неверно, Потому что ты сравниваешь не строки (массивы) а указатели на них.
if(!Dest[0]) /*строка пустая*/ // если хочешь определить, что строка пустая (хотя странно, почему бы в функцию NULL не передать, вместо пустой строки)


Это сообщение отредактировал(а) 586 - 28.8.2007, 22:04
PM   Вверх
ChihPih
Дата 29.8.2007, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 532
Регистрация: 3.12.2006

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



Цитата(586 @ 28.8.2007,  21:58)
Цитата(ChihPih @  28.8.2007,  21:08 Найти цитируемый пост)
sh.pFrom = Data,"\0";


???  smile

А тут чаво ненравится?


--------------------
www.info-x.org - информационный ресурс о ОС FreeBSD. Форум.
PM MAIL WWW Jabber   Вверх
586
Дата 29.8.2007, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



это в коде лишнее. равносильно этому
Код
sh.pFrom = "\0";


Это сообщение отредактировал(а) 586 - 11.5.2010, 04:02
PM   Вверх
ChihPih
Дата 29.8.2007, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 532
Регистрация: 3.12.2006

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



Цитата

это в коде лишнее. равносильно этому


А в конце пути обязательно надо добавлять "\0" или char(0). Это в MSDN написано!
И даже когда я на Delphi писал, без этого знака глюки вышеописанные были!
Дак как правильно написать?


--------------------
www.info-x.org - информационный ресурс о ОС FreeBSD. Форум.
PM MAIL WWW Jabber   Вверх
SenkraD
Дата 29.8.2007, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

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



ChihPih,  в поля From и To можно несколько файлов передавать разделённых ';' и завершающим нулём, поэтому в конце строки должно быть два завершающих нуля


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
586
Дата 29.8.2007, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(ChihPih @  29.8.2007,  18:37 Найти цитируемый пост)
Это в MSDN написано!

там по другому написано
Цитата(msdn)
// WRONG
LPTSTR pszSource = L"C:\\Windows\\*";

// RIGHT
LPTSTR pszSource = L"C:\\Windows\\*\0";

И такие действия надо предпринимать перед вызовом функции ProcFiles, а если внутри функции - то надо выделять буфер на 1 размер больше, и дописывать нуль в конце. И еще: если сохранишь эту строку в AnsiString то ты этот нуль потеряешь.

Это сообщение отредактировал(а) 586 - 29.8.2007, 23:38
PM   Вверх
ChihPih
Дата 30.8.2007, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 532
Регистрация: 3.12.2006

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



 smile 


--------------------
www.info-x.org - информационный ресурс о ОС FreeBSD. Форум.
PM MAIL WWW Jabber   Вверх
ChihPih
Дата 30.8.2007, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 532
Регистрация: 3.12.2006

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



Вот, сам накалякал!

Код

bool WINAPI ProcFiles(HANDLE Handle, UINT Operation, char *Data, char *Dest)
{
  TSHFileOpStruct sh;
  bool check = false;

  char *data_n = new char[strlen(Data) + 1];
  strcpy(data_n, Data);
  strcat(data_n, "\0");

  char *dest_n = new char[strlen(Dest) + 1];
  strcpy(dest_n, Dest);
  strcat(dest_n, "\0");

  sh.hwnd = Handle;
  sh.wFunc = Operation;
  sh.pFrom = data_n;
  if (Dest == NULL){ sh.pTo = NULL; }
  else { sh.pTo = dest_n; }
  sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT;
  sh.hNameMappings = 0;
  sh.lpszProgressTitle = NULL;
  if (SHFileOperation(&sh) == 0){ check = true; }

  delete data_n;
  delete dest_n;

  return check;
}


Вроде бы сделал все как надо, а глюки теже!

Это сообщение отредактировал(а) ChihPih - 30.8.2007, 21:02


--------------------
www.info-x.org - информационный ресурс о ОС FreeBSD. Форум.
PM MAIL WWW Jabber   Вверх
586
Дата 30.8.2007, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код
// ....
  char *data_n = new char[strlen(Data) + 2];
  strcpy(data_n, Data);
  //strcat(data_n, "\0");
  data_n[strlen(data_n)+1]=0;

  char *dest_n = new char[strlen(Dest) + 2];
  strcpy(dest_n, Dest);
  //strcat(dest_n, "\0");
  dest_n[strlen(dest_n)+1]=0;
// ....

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


Опытный
**


Профиль
Группа: Участник
Сообщений: 532
Регистрация: 3.12.2006

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



Цитата

char *data_n = new char[strlen(Data) + 2];
...


А вот только почему +2, а не +1?

И еще вопрос: а можно вот так?

Код

  char *data_n = new char[strlen(Data) + 2];
  strcpy(data_n, Data);
  strcat(data_n, "\0");
  //data_n[strlen(data_n)+1]=0;


Это сообщение отредактировал(а) ChihPih - 30.8.2007, 21:22


--------------------
www.info-x.org - информационный ресурс о ОС FreeBSD. Форум.
PM MAIL WWW Jabber   Вверх
586
Дата 30.8.2007, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



strlen выдает количестро символов в строке, а не размер. Если не веришь сравни
Код
Caption=strlen("");  // 0
// 
Caption=sizeof("");  // 1

Цитата(ChihPih @  30.8.2007,  22:17 Найти цитируемый пост)
И еще вопрос: а можно вот так?

нет. Ansi-строка заканчивается на один нуль. их там два. следовательно второй нуль просто не виден.
PM   Вверх
ChihPih
Дата 30.8.2007, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 532
Регистрация: 3.12.2006

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



Спасибо за помощь!


--------------------
www.info-x.org - информационный ресурс о ОС FreeBSD. Форум.
PM MAIL WWW Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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