[Visual C++] listowanie katalogów

0

Witam.
Mam problem taki jak w temacie czyli jak wykonać listowanie katalogów żeby program nie zwracał błędu o niewłaściwej ścieżce. Na razie udało mi się tylko dotrzeć do momentu w którym w comboboxie są wyświetlane wszystkie dyski logiczne. Dalej jest pod górkę :) mianowicie przy próbie wyświetlenia zawartości np dysku C:\ dostaję błąd o niewłaściwej ścieżce dostępu. Jak na razie udało mi się dojść do tego że ścieżka zadeklarowana na stałe np : C:\ działa bezproblemowo ale nijak nie mogę zmusić programu do wyświetlenia zaw. dys. wybranego z comboboxa. Może ktoś wie jak to zrobić ?

0

A w jakim języku piszesz i z jakich bibliotek korzystasz?

Tak czy siak, listowanie pewno natrafia na brak uprawnień dostępu do katalogu. Najprostsze rozwiązanie to złapanie wyjątków i olanie ich.

0

Piszę w Visual C++ , działam na Win Vista , co do braku uprawnień to raczej nie tu tkwi problem ponieważ i taką możliwość sprawdziłem - przełączyłem Visual C++ 2008 EE na upr. adm. oraz sam program uruchomiłem z upr. adm. i dalej to samo. Tak jak pisałem wyżej nie chodzi o to że listowanie w trakcie działania trafia na błąd tylko dostaję błąd mówiący o złej ścieżce dostępu. Nawet po zmianie sposobu wyświetlania liter napędów w comboBoxie (czyli dodaniu drugiego \ co teoretycznie powinno pomóc) nic się nie zmienia i dalej jest ten sam błąd - stąd moje pytanie : Co zrobić żeby usunąć ten błąd ?

edit:
Język to C++/CLI a biblioteki :

        using namespace System;
	using namespace System::ComponentModel;
	using namespace System::Collections;
	using namespace System::Windows::Forms;
	using namespace System::Data;
	using namespace System::Drawing;
	using namespace System::IO;
0

A język i biblioteki? Visual C++ wspiera 3 języki...

0
programming... napisał(a)

co do braku uprawnień to raczej nie tu tkwi problem ponieważ i taką możliwość sprawdziłem - przełączyłem Visual C++ 2008 EE na upr. adm. oraz sam program uruchomiłem z upr. adm. i dalej to samo.</cpp>

:|
Nawet jak sobie w Windowsie ustawisz Godlike dla swojego programu to i tak nie będzie miał on uprawnień do katalogów systemowych, np. "Document and Settings" pod Vistą czy też "System Volume Information". Nie wiem, czy przewidziałeś taką możliwość, bo nawet nie byłeś łaskaw pokazać kodu, którym listujesz katalogi.

0

Przy uruchamianiu programu część "zbierająca" napędy:

InitializeComponent();
			//
			//TODO: Add the constructor code here
			//
			try
			{
				comboBox1->Items->Clear();
			array <String^> ^napdy = Directory::GetLogicalDrives();
			 for (System::Int16 i=0; i<napdy->Length; i++)
			{
				comboBox1->Items->Add(napdy[i]+System::Environment::NewLine);
			 } 
			}
			catch (Exception^ e)
			{
				MessageBox::Show("Wystąpił błąd");
			}

Po wybraniu napędu z comboBoxa:

                                      try
				 {
					 listView1->Items->Clear();
					 array <String^> ^pliki = Directory::GetDirectories(comboBox1->Text);
					for (System::Int16 i=0; i<pliki->Length; i++)
					{
							listView1->Items->Add(pliki[i]+System::Environment::NewLine);
					}
				}
					catch ( Exception^ e ) 
					 {
						 MessageBox::Show("Wystąpił błąd");

					 }
0

Aha, to źle zrozumiałem, myślałem, że jesteś etap dalej i krzaczy się na czym innym.

Najpierw dodajesz sobie jakiś syf do nazwy napędu, a potem się dziwisz, że coś nie działa :|
Po kiego grzyba Ci to "System::NewLine" na końcu nazwy napędu?

I jeszcze takie pytanie - czemu w pętlach używasz System::Int16 zamiast int?

	private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {
				this->comboBox1->Items->Clear();
				try
				{
					array <String^> ^napedy = Directory::GetLogicalDrives();
					for (int i = 0; i < napedy->Length; i++)
                        this->comboBox1->Items->Add(napedy[i]);
                }
                catch (Exception^ e)
                {
					MessageBox::Show(e->Message, "Błąd!");
                }

			 }

	private: System::Void comboBox1_SelectedIndexChanged(System::Object^  sender, System::EventArgs^  e) {
				try
                {
					this->listBox1->Items->Clear();
                    array <String^> ^katalogi = Directory::GetDirectories(comboBox1->Text);
                    for (int i = 0; i < katalogi->Length; i++)
                        this->listBox1->Items->Add(katalogi[i]);
                }
                catch ( Exception^ e )
                {
					MessageBox::Show(e->Message, "Błąd!");
                }
			 }
0

Używam System::Int16 ponieważ w poszukiwaniu rozwiązania trafiłem na przykład w którym było to tak rozwiązane i tak zostało u mnie , a System::NewLine jest po to żeby każda litera napędu była w oddzielnej linii.

Edit:
Dzięki za pomoc somekind , w końcu działa :)

0

Iterowanie pętli ponoć najwydajniej jest realizowane, gdy zmienna iterująca jest typu int.
Ponadto System::Int16 to oficjalna nazwa dla "short" - ja bym wolał tak napisać, bo krócej ;)

W przypadku kontrolek WinForms nie ma sensu dodawać tego System::NewLine, bo kolejne Itemy z kolekcji i tak się znajdą w kolejnych "liniach" kontrolki. Ten kod pewno służył do robienia list i wyświetlania ich w konsoli albo zapisywania do pliku, a Ty po prostu skopiowałeś go be zastanowienia. Bardzo nieładnie ;P

I jeszcze coś - masz na początku kodu "using namespace System;", więc nie musisz już pisać "System::" jeśli chcesz użyć czegoś z tej przestrzeni. Wystarczyłoby np. "Int16" i "Environment::NewLine".

Chyba powinieneś poczytać trochę o podstawach .NET, bo widać u Ciebie sporo braków.

1 użytkowników online, w tym zalogowanych: 0, gości: 1