Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.06.2013, 19:02   #1
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию Преобразование строки (адрес папки на диске) по шаблону

Пишу программу,которая ищет на диске папки с фильмами,добавляет их в ListBox,а затем можно произвольную папку расшарить по сети.
В ListBox данные заносятся в таком виде:
D:\Folder1\Video1\
E:\Video2\
и так далее.
Теперь мне нужно эти строки обработать:
1. Выделить последний текст перед символом "\" (это будет название ресурса для шары)
2. Преобразовать путь к виду D:\\Folder1\\Video1 т.к. функция API NetShareAdd работает с адресами директорий в таком виде.

Какой метод Strings здесь проще всего использовать?
calypso вне форума Ответить с цитированием
Старый 08.06.2013, 11:02   #2
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

1. LastDelimiter
2. Преобразовывать ничего не надо
FataLL вне форума Ответить с цитированием
Старый 08.06.2013, 17:10   #3
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Ну попробуйте расшарить C:\Games\ или C:\\Games\\ или C:\Games - NetShareAdd выдаст вам ошибку 123 в параметре 8 (недопустимое имя или такой ресурс нельзя расшарить)
calypso вне форума Ответить с цитированием
Старый 08.06.2013, 18:01   #4
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

calypso
Советую не умничать, а изучить представление строк и их запись в коде, чтобы не шокировать своими "познаниями" уважаемую публику. После чего неплохо было бы выложить свой код для более предметного разбирательства.
FataLL вне форума Ответить с цитированием
Старый 08.06.2013, 19:35   #5
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Код:
void __fastcall TForm9::Button2Click(TObject *Sender)
{
int papkaindex=ListBox2->ItemIndex;
WideString papkashare=sharelist->Strings[papkaindex];
NET_API_STATUS res;
SHARE_INFO_2 p;
DWORD parm_err = 0;
p.shi2_netname =TEXT("MegaShare");
//p.shi2_netname = papkashare.operator wchar_t *();
p.shi2_type = STYPE_DISKTREE; // disk drive
p.shi2_remark = TEXT("TESTSHARE to test NetShareAdd");
p.shi2_permissions = 0;
p.shi2_max_uses = 4;
p.shi2_current_uses = 0;
//p.shi2_path = papkashare.operator wchar_t *();
p.shi2_path = TEXT("E:\\video");  //РАБОТАЕТ
//p.shi2_path = TEXT("E:\\video\\");  //НЕ РАБОТАЕТ
//p.shi2_path = TEXT("E:\video\"); //НЕ РАБОТАЕТ 
p.shi2_passwd = NULL; // no password
res=NetShareAdd(0,2, (LPBYTE) &p,&parm_err);
int oshibka=GetLastError();
ShowMessage("Код возврата ошибки: "+IntToStr(oshibka)+res+parm_err);
}
calypso вне форума Ответить с цитированием
Старый 08.06.2013, 23:23   #6
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

calypso
Так как читать никто ничего не хочет, попробую объяснить "открытую америку": знак обратной косой черты '\' используется для экранирования спецсимволов. Например, '\n' - символ новой строки, '\t' - символ табуляции и т.д и т.п. Поэтому, для ввода самого символа бэкслэша используется последовательность '\\'. Подробнее, для совсем танкистов

Код:
p.shi2_path = TEXT("E:\\video");  // РАБОТАЕТ, так как соответствует e:\video - правильно
//p.shi2_path = TEXT("E:\\video\\");  //НЕ РАБОТАЕТ, так как e:\video\ - лишняя обратная косая черта в конце
//p.shi2_path = TEXT("E:\video\"); //НЕ РАБОТАЕТ - так как вообще не компилируется
FataLL вне форума Ответить с цитированием
Старый 09.06.2013, 12:22   #7
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Кажется понял,т.е. если я тупо задам ему E:\Video - то работать не будет.
А если получим переменную,в которой этот путь найден через TSearchRec ,то компилятор сам всё правильно преобразует и вмешательство пользователя не требуется?
calypso вне форума Ответить с цитированием
Старый 11.06.2013, 16:23   #8
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

Понял ты неправильно. Даже если "тупо" задать, но корректно, будет работать. И компилятор тут не при чём...
FataLL вне форума Ответить с цитированием
Старый 11.06.2013, 17:03   #9
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Вот сделал,код рабочий:
Код:
void __fastcall TForm9::Button2Click(TObject *Sender)
{
int truncatepapka,papkaindex=ListBox2->ItemIndex;
WideString nameshare,papkashare=sharelist->Strings[papkaindex-1];
NET_API_STATUS res;
SHARE_INFO_2 p;
DWORD parm_err = 0;
//ИЗ ПУТИ ДИРЕКТОРИИ НУЖНО ВЫПИЛИТЬ ПОСЛЕДНИЙ СИМВОЛ \
//НАХОДИМ ЕГО ПОЗИЦИЮ И УДАЛЯЕМ 1 СИМВОЛ ИЗ КОНЦА
//ПОЛУЧИЛИ АДРЕС ПАПКИ ДЛЯ ВЫДЕЛЕНИЯ ОБЩЕГО ДОСТУПА
truncatepapka=LastDelimiter("\\",papkashare);
papkashare.Delete(truncatepapka,truncatepapka+1);
//ДЛЯ ПОЛУЧЕНИЯ ИМЕНИ ОБЩЕГО РЕСУРСА НУЖНО ПОЛУЧИТЬ ИМЯ ПАПКИ
//МЕЖДУ ДВУМЯ ПОСЛЕДНИМИ СИМВОЛАМИ \
//ДЛЯ ЭТОГО ИЗ C:\Folder1 УДАЛЯЕМ ВСЁ ДО ПОСЛЕДНЕГО СИМВОЛА \
//В РЕЗУЛЬТАТЕ, papkashare=C:\Folder1 ,nameshare=Folder1
nameshare=papkashare;
truncatepapka=LastDelimiter("\\",nameshare);
nameshare.Delete(1,truncatepapka);
p.shi2_netname = nameshare.operator wchar_t *();
p.shi2_type = STYPE_DISKTREE; // disk drive
p.shi2_remark = TEXT("TESTSHARE to test NetShareAdd");
p.shi2_permissions = 0;
p.shi2_max_uses = 4;
p.shi2_current_uses = 0;
p.shi2_path = papkashare.operator wchar_t *();
p.shi2_passwd = NULL; // no password
//ФУНКЦИЯ ВЕРНЕТ УСПЕШНЫЙ РЕЗУЛЬТАТ ЕСЛИ АДРЕС ИМЕЕТ ВИД
//C:\Video ,ПОСЛЕДНИЙ СИМВОЛ \ В КОНЦЕ НАДО УДАЛЯТЬ
res=NetShareAdd(0,2, (LPBYTE) &p,&parm_err);
int oshibka=GetLastError();
ShowMessage("Код возврата ошибки: "+IntToStr(oshibka)+res+parm_err);
ShowMessage(papkashare+" позиция"+IntToStr(truncatepapka));
}
calypso вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получить адрес файла или папки bigory Visual C++ 2 11.12.2012 02:25
Проверка строки по шаблону apx_angel Общие вопросы Delphi 2 30.08.2010 18:41
поиск строки в файле по шаблону andru15 Общие вопросы C/C++ 1 16.02.2009 18:44