Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Получение имён файлов в директори


Автор: sergy 13.1.2008, 13:49
Здравствуйте. Помогите плз разобратсья с folderBrowserDialog.
Мне необходимо открыть файл из папки в picturebox и после этого создать кнопку "следующее изображение" при нажатии которой будет открываться следующий файл из текущей директории.

вот так я открываю первый файл и запоминаю директорию:

Код

if(folderBrowserDialog1->ShowDialog()==DialogResult::OK)
             {
                 folderName = folderBrowserDialog1->SelectedPath;
                openFileDialog1->InitialDirectory = folderName;
                openFileDialog1->ShowDialog();
                if(openFileDialog1->FilterIndex==1) {
pictureBox1->Image = Image::FromFile(openFileDialog1->FileName,"\\*.jpeg");
statusBar1->Text = folderName;
            
}
}


а как мне получить имена всех файлов в этой директории? подскажите плз.

Автор: farad 13.1.2008, 16:33
Код

System.IO.Directory.GetFiles(@"c:\")

Автор: sergy 13.1.2008, 17:02
Огромное спасибо, за быстрый ответ.


и ещё один вопросик:

в MSDN говорится как отфильтровать только по 1 типу файлов.
Код

files = IO::Directory::GetFiles(folderName, "*.jpg");

 а как мне задать несколько типов?

Автор: farad 13.1.2008, 22:43
Цитата(sergy @  13.1.2008,  17:02 Найти цитируемый пост)
 а как мне задать несколько типов?
по очереди

Автор: sergy 14.1.2008, 00:47
Цитата(farad @ 13.1.2008,  22:43)
Цитата(sergy @  13.1.2008,  17:02 Найти цитируемый пост)
 а как мне задать несколько типов?
по очереди

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

Код

files = IO::Directory::GetFiles(folderName, "*.jpg *.gif");


Код

files = IO::Directory::GetFiles(folderName, "*.jpg, *.gif");


Код

files = IO::Directory::GetFiles(folderName, "*.jpg; *.gif");


Код

files = IO::Directory::GetFiles(folderName, "*.jpg|*.gif");


Код

files = IO::Directory::GetFiles(folderName, "*.jpg""*.gif");


Код

files = IO::Directory::GetFiles(folderName, "*.jpg","*.gif");


Код

files = IO::Directory::GetFiles(folderName, "*.jpg"|"*.gif");


Код

files = IO::Directory::GetFiles(folderName, "*.jpg";"*.gif");


Код

files = IO::Directory::GetFiles(folderName, "(*.jpg) (*.gif)");


Код

files = IO::Directory::GetFiles(folderName, "(*.jpg), (*.gif)");


Код

files = IO::Directory::GetFiles(folderName, "(*.jpg);(*.gif)");


Код

files = IO::Directory::GetFiles(folderName, "(*.jpg)|(*.gif)");


у меня уже фантазии не хватает  smile 

 smile 

Автор: mr.DUDA 14.1.2008, 10:19
С разделителями не получится, GetFiles их не понимает. Поэтому только по порядку:
Код
        List<string> GetMyFiles(string folderName, string searchPattern)
        {            
            List<string> ret = new List<string>();
            string[] extensions = searchPattern.Split(';', '|', ',');
            foreach (string ext in extensions)
            {
                if (!string.IsNullOrEmpty(ext))
                    ret.AddRange(Directory.GetFiles(folderName, ext));
            }
            return ret;
        }

        void DoSome()
        {
            List<string> fileNames = GetMyFiles("c:\\", "*.ini;*.sys");
        }


На С++ сами переводите.

Автор: sergy 15.1.2008, 00:27
спасибо, но не по силам это для меня ))

а если сделать вот так:
Код


files = IO::Directory::GetFiles(folderName, "*.jpg");
    files2 = IO::Directory::GetFiles(folderName, "*.gif");
    files3 = IO::Directory::GetFiles(folderName, "*.png");
    files4 = IO::Directory::GetFiles(folderName, "*.bmp");

но проблема очередная. теперь бы всё это в один массив запихнуть и будет супер. если подскажете как это сделать, то буду очень признателен и наверное это будет последний мой вопрос smile

вообще никак не могу найти как в С++ дописывать в переменные значения. например в php можно сделать так:
Код

$var = "123";
$vaf .="456";


    echo $var ---->123456

Автор: farad 15.1.2008, 10:06
Цитата(sergy @  15.1.2008,  00:27 Найти цитируемый пост)
 теперь бы всё это в один массив запихнуть и будет супер

Код

 array<String^>^files1=System::IO::Directory::GetFiles("c:\\", "*.gif");
 array<String^>^files2=System::IO::Directory::GetFiles("c:\\", "*.jpg");
 array<String^>^files_all=gcnew array<String ^>(files1->Length+files2->Length);
 int i=0;
 int j=0;
 while(j<files1->Length)
     files_all[i++]=files1[j++];
 j=0;
 while(j<files2->Length)
     files_all[i++]=files2[j++];

 - всетаки чудовищный синтаксис  smile 

Цитата(sergy @  15.1.2008,  00:27 Найти цитируемый пост)
 как в С++ дописывать в переменные значения

Код

var="123";
var+="456";



Автор: sergy 15.1.2008, 19:07
farad, спасибо большое!

Но при компиляции этого кода в строке    
Код

files_all[i++]=files1[j++];

 получаю ошибку:

An unhandled exception of type 'System.NullReferenceException' occurred in IV.exe

Additional information: Object reference not set to an instance of an object.

Автор: farad 15.1.2008, 20:06
ну я же набросал примерный вариант. Конечно нужно проверять, не указывают ли ссылки на null.

Автор: sergy 15.1.2008, 23:08
Вы это имели ввиду?
Код

if(files1 != NULL){
j=0;
while(j<files1->Length){
if(files1[j++] != NULL)
    files[i++]=files1[j];

}


к сожалению, ошибка осталась.

Автор: CYBERDREAM 16.1.2008, 09:19
мне кажется ты инкремируешь j не в том месте, (хотя может я ошибаюсь). Попробуй так:
Код

if(files1 != NULL){
j=0;
while(j<files1->Length){
if(files1[j] != NULL)
    files[i++]=files1[j++];
}

Автор: farad 16.1.2008, 10:27
Цитата(sergy @  15.1.2008,  23:08 Найти цитируемый пост)
Вы это имели ввиду?код:if(files1 != NULL)
 smile Разумеется нет!
Цитата(sergy @  15.1.2008,  23:08 Найти цитируемый пост)
if(files1[j++] != NULL)   files[i++]=files1[j];
и не это точно!
вот рабочий код, в котором не нужна проверка на null, копируете по буквам:
Код

    private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) 
             {
             
                
                 array<String^>^files1=System::IO::Directory::GetFiles("c:\\", "*.gif");
                 array<String^>^files2=System::IO::Directory::GetFiles("c:\\", "*.jpg");
                 array<String^>^files_all=gcnew array<String ^>(files1->Length+files2->Length);

                 int i=0;
                 int j=0;
                 while(j<files1->Length)
                     files_all[i++]=files1[j++];
                 j=0;
                 while(j<files2->Length)
                     files_all[i++]=files2[j++];

                 for(i=0;i<files_all->Length;i++)
                 System::Diagnostics::Debug::WriteLine(files_all[i]);
             }
 к слову сказать, если требуется проверка ссылочных переменных - инициализированы они или нет, то для этого используют не сишный макрос NULL, а слово nullptr. Для данного примера следует писать так:
Код

if(files_all==nullptr)return;

Может быть стоит что-то почитать по теме?

Автор: sergy 16.1.2008, 21:02
Огромное всем спасибо за помощь. Мог бы, поставил бы всем +10 )

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)