152 / 103 / 52
Регистрация: 08.01.2013
Сообщений: 588
1

Выбрать нужный файл в папке с неполным именем

23.09.2015, 17:09. Показов 1171. Ответов 20
Метки нет (Все метки)

Есть директория "С:" в которой есть папка "data", а в этой папке куча папок и один файл, папки и файл имеют разные имена, знаю длину имени файла rt0000.dat вместо "0000" может быть все что угодно,расширение dat не меняется, но только 4 символа, папки с началом rt не существует, нужно чтобы программа находила файл rtXXXX.dat он там будет один, и в массив char пихала полный путь файла.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.09.2015, 17:09
Ответы с готовыми решениями:

Поиск файлов с неполным именем
Например мне надой найти файл "Delegation.txt", но у меня в наличи есть не все имя файла ,а только...

Проверка есть ли в папке файл с таким же именем
Здравствуйте! Нужно сделать закачку файла в папку, но чтобы названия не повторялись загрузка у...

Проверить есть ли файл с заданным именем в папке
Здравствуйте. Мне необходимо проверить есть ли файл с таким именем в папке, и если есть, то...

Не могу открыть файл, размещенный в папке с именем на русском языке
Файл на D:\Решетова_Н\Галкин\Всякое Если помещаю файл непосредственно на D - все работает. Думаю...

20
723 / 514 / 128
Регистрация: 31.05.2013
Сообщений: 2,827
Записей в блоге: 3
23.09.2015, 19:54 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void __fastcall TForm1::Button6Click(TObject *Sender)
{
 AnsiString aPath="D:\\Скачка\\";      // каталог, в котором находится файлы (укажешь свой)
 TSearchRec aSearchRec; // рез-т поиска файла
 
 TStringList*lst = new TStringList;//список файлов в директории с расширением dat
 if ( FindFirst(aPath+ "*.dat", faAnyFile, aSearchRec) == 0)
    {
       while ( FindNext(aSearchRec) == 0 )  // найти след файл
       {
           //Теперь смотрим подходит ли файл для твоих параметров
           if(aSearchRec.Name.SubString(1,2)=="rt" && aSearchRec.Name.Length()==10)
           lst->Add(aPath+aSearchRec.Name);
       }
    }
 
 ShowMessage(lst->Text);
 delete lst;
}
//---------------------------------------------------------------------------
0
152 / 103 / 52
Регистрация: 08.01.2013
Сообщений: 588
24.09.2015, 12:29  [ТС] 3
Условие не выполняется(( он чувствителен к регистру букв rt?
C++
1
2
if(aSearchRec.Name.SubString(1,2)=="rt" && aSearchRec.Name.Length()==10)
           lst->Add(aPath+aSearchRec.Name);
0
управление сложностью
1685 / 1297 / 260
Регистрация: 22.03.2015
Сообщений: 7,548
Записей в блоге: 5
24.09.2015, 12:38 4
Конечно чувствителен.
0
152 / 103 / 52
Регистрация: 08.01.2013
Сообщений: 588
24.09.2015, 12:40  [ТС] 5
Всё равно не работает(((
0
723 / 514 / 128
Регистрация: 31.05.2013
Сообщений: 2,827
Записей в блоге: 3
24.09.2015, 12:44 6
bloomder, в чем заключается что не работает? не ищет?как вы указываете директорию (желательно код как вы указали ее)?
0
152 / 103 / 52
Регистрация: 08.01.2013
Сообщений: 588
24.09.2015, 13:00  [ТС] 7
В aPath запихнул путь из Edit1->Text
Выводил aPath он показывал путь C:\data\
А дальше все по вашему коду, ShowMessage работает, но lst остается пустым, при отладке я смотрел на условие которое выше, оно не выполняется, при учтенных регистрах, можно конечно регистры убрать и по расширению файла и количеству символов искать, он там будет один, но всё равно не получилось
Условие не выполняется даже это
C++
1
if(aSearchRec.Name.Length()==10)
И в папке data лежит файл rt0000.dat
0
723 / 514 / 128
Регистрация: 31.05.2013
Сообщений: 2,827
Записей в блоге: 3
24.09.2015, 13:01 8
Текст Edit1->Text из можно сюда?
0
152 / 103 / 52
Регистрация: 08.01.2013
Сообщений: 588
24.09.2015, 13:18  [ТС] 9
Может и нельзя, ну в aPath лежал путь к папке
C++
1
2
3
4
5
6
7
8
String s;
int ks;
s=Edit1->Text;
ks=s.Lenght();
for(int q=1;(q<=(ks-16));q++)
{
aPath+=s[q];
}
От переменной s отсчитывал нужное мне количество символов и получил путь к нужной мне папке и выводил этот путь на экран
0
723 / 514 / 128
Регистрация: 31.05.2013
Сообщений: 2,827
Записей в блоге: 3
24.09.2015, 13:25 10
bloomder, я это к чему хотел сказать, что путь указывать нужно обязательно с двумя слешами, между папками, если вы его берете из текста,иначе компилятор не поймет путь.В вашем случае он должен иметь следующий вид "С:\\data\\", но ни как не "С:\data"
0
152 / 103 / 52
Регистрация: 08.01.2013
Сообщений: 588
24.09.2015, 13:31  [ТС] 11
Когда ты прописываешь путь, согласен, нужно \\ а когда из edit нужно \
У меня нормально другие файлы открывает
0
723 / 514 / 128
Регистрация: 31.05.2013
Сообщений: 2,827
Записей в блоге: 3
24.09.2015, 13:38 12
Лучший ответ Сообщение было отмечено bloomder как решение

Решение

да я понял в чем косяк, вот поменяете на этот код

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 AnsiString aPath=Edit1->Text;      // каталог, в котором находится файлы (укажешь свой)
 TSearchRec aSearchRec; // рез-т поиска файла
 
 TStringList*lst = new TStringList;//список файлов в директории с расширением dat
 if ( FindFirst(aPath+ "*.dat", faAnyFile, aSearchRec) == 0)
    {
       lst->Add(aPath+aSearchRec.Name);
       while ( FindNext(aSearchRec) == NULL )  // найти след файл
       {
           //Теперь смотрим подходит ли файл для твоих параметров
           if(aSearchRec.Name.SubString(1,2)=="rt" && aSearchRec.Name.Length()==10)
           lst->Add(aPath+aSearchRec.Name);
       }
    }
 
 ShowMessage(lst->Text);
 delete lst;
0
152 / 103 / 52
Регистрация: 08.01.2013
Сообщений: 588
24.09.2015, 13:39  [ТС] 13
Может быть вы и правы в данной ситуации, но когда я открывал файлы fopen'Ом мне хватало пути из edit'a
C++
1
2
3
4
5
6
7
8
FILE *f1;
String s;
int ks;
s=Edit1->Text;
ks =s.Length();
char* p = new char[ks];
p=s.c_str();
f1=fopen(p,"wb");
И все у меня прекрасно работало
0
723 / 514 / 128
Регистрация: 31.05.2013
Сообщений: 2,827
Записей в блоге: 3
24.09.2015, 13:44 14
bloomder, Нет то у меня в коде проблема была, я не брал первый элемент из массива.
0
152 / 103 / 52
Регистрация: 08.01.2013
Сообщений: 588
24.09.2015, 13:49  [ТС] 15
Добавлено через 1 минуту
Всё равно не работает(((
Путь даже прописал
String aPath="C:\\data\\";

И правильнее будет так скобки Вы забыли
C++
1
2
3
4
if(aSearchRec.Name.SubString(1,2)=="rt" && aSearchRec.Name.Length()==10)
{
           lst->Add(aPath+aSearchRec.Name);
}
Если условие не выполнится, он не запишет в lst
0
723 / 514 / 128
Регистрация: 31.05.2013
Сообщений: 2,827
Записей в блоге: 3
24.09.2015, 13:54 16
Вы перед while добавили строку. что в последнем варианте было?
0
152 / 103 / 52
Регистрация: 08.01.2013
Сообщений: 588
24.09.2015, 15:07  [ТС] 17
Сорри, спасибо заработало даже со своим вариантом из edit

Добавлено через 1 час 10 минут
А если файл не существует или другой файл будет с такой же размерностью имени, при повторном нажатии на кнопку сыпятся ошибки доступа
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 while ( FindNext(aSearchRec) == NULL )  // найти след файл
       {
           //Теперь смотрим подходит ли файл для твоих параметров
           if(aSearchRec.Name.SubString(1,2)=="rt" && aSearchRec.Name.Length()==10)
           {
              z=1;
              lst->Add(aPath+aSearchRec.Name);
            }
       }
if(z==0)
{
\\ ошибка вывод сообщения об ошибке и goto в конец кода программы, чтобы можно было не закрывая программу
\\ нажать снова кнопку "выполнить" и этот блок с button6click работал исправно
delete lst;
FindClose(aSearchRec);
goto endb1;
}
else
{ \\ норм и дальше продолжение}
0
723 / 514 / 128
Регистрация: 31.05.2013
Сообщений: 2,827
Записей в блоге: 3
24.09.2015, 15:25 18
bloomder, Это уже где то ошибка в вашем коде (без демонстрации всей функции, вряд ли смогу помочь),
0
152 / 103 / 52
Регистрация: 08.01.2013
Сообщений: 588
24.09.2015, 16:25  [ТС] 19
Неа, до вашего кода нормально, после всякие ошибки сыпятся(((
0
723 / 514 / 128
Регистрация: 31.05.2013
Сообщений: 2,827
Записей в блоге: 3
24.09.2015, 16:26 20
В общем луче весь код показывайте
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.09.2015, 16:26

Перед выполнением задания необходимо создать в рабочей папке файл SIMP.FOR. Создать командный файл с именем _E
Перед выполнением задания необходимо создать в рабочей папке файл SIMP.FOR. Создать командный файл...

Выбрать 1 файл в папке
Здравствуйте , подскажите, как открыть файл, стоящий на первом месте, в папке &quot;Новая папка&quot; ? ...

Проверить есть ли в папке файл с заданным именем; если нет такого, то открыть другой
Когда открываю форму она загружает в два picturebox 2 картинки, необходимо проверить есть ли в...

Скачивание файла из интернета с неполным именем файла
Необходимо скачать файл часть имени которого неизвестна. Например: сервер может создать файл с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.