Skocz do zawartości
Zamknięcie Forum PC LAB

Szanowny Użytkowniku,

Informujemy, że za 30 dni tj. 30 listopada 2024 r. serwis internetowy Forum PC LAB zostanie zamknięty.

Administrator Serwisu Forum PC LAB - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie: wypowiada całość usług Serwisu Forum PC LAB z zachowaniem miesięcznego okresu wypowiedzenia.

Administrator Serwisu Forum PC LAB informuje, że:

  1. Z dniem 29 listopada 2024 r. zakończy się świadczenie wszystkich usług Serwisu Forum PC LAB. Ważną przyczyną uzasadniającą wypowiedzenie jest zamknięcie Serwisu Forum PC LAB
  2. Dotychczas zamowione przez Użytkownika usługi Serwisu Forum PC LAB będą świadczone w okresie wypowiedzenia tj. do dnia 29 listopada 2024 r.
  3. Po ogłoszeniu zamknięcia Serwisu Forum od dnia 30 października 2024 r. zakładanie nowych kont w serwisie Forum PC LAB nie będzie możliwe
  4. Wraz z zamknięciem Serwisu Forum PC LAB, tj. dnia 29 listopada 2024 r. nie będzie już dostępny katalog treści Forum PC LAB. Do tego czasu Użytkownicy Forum PC LAB mają dostęp do swoich treści w zakładce "Profil", gdzie mają możliwość ich skopiowania lub archiwizowania w formie screenshotów.
  5. Administrator danych osobowych Użytkowników - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie zapewnia realizację praw podmiotów danych osobowych przez cały okres świadczenia usług Serwisu Forum PC LAB. Szczegółowe informacje znajdziesz w Polityce Prywatności

Administrator informuje, iż wraz z zamknięciem Serwisu Forum PC LAB, dane osobowe Użytkowników Serwisu Forum PC LAB zostaną trwale usunięte ze względu na brak podstawy ich dalszego przetwarzania. Proces trwałego usuwania danych z kopii zapasowych może przekroczyć termin zamknięcia Forum PC LAB o kilka miesięcy. Wyjątek może stanowić przetwarzanie danych użytkownika do czasu zakończenia toczących się postepowań.

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

Zdziwiony

[C#]Problem z GetFiles

Rekomendowane odpowiedzi

Witam. Mam taki oto kod:

private void ListujPlikiWindows()
       {
           try
           {
               string[] Files;

               Files = Directory.GetFiles(Environment.GetEnvironmentVariable("windir"), ".txt", SearchOption.AllDirectories);
               //tutaj foreach
               ///
           }
           catch(Exception e)
           {
               MessageBox.Show(e.ToString());
           }
       }

Kod wylistowuje wszystkie pliki o danym rozszerzeniu w katalogu windowsa, jednak kiedy napotka na folder lub plik do, którego nie może uzyskać dostępu program przeskakuje od razu do catch'a i nie mogę już nic z tym więcej zrobić. Chcę osiągnąć taki efekt, aby program w przypadku braku dostępu do pliku po prostu go ominął i listował dalej, niestety nie wiem jak to osiągnąć :/.

 

Proszę o pomoc.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Problem w tym, że wyjątek występuje dla linijki:

Files = Directory.GetFiles(Environment.GetEnvironmentVariable("windir"), ".txt", SearchOption.AllDirectories);

a tu, nie używam foreach

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie tylko tej linijki. Nie napisałem żebyś przeniósł, tylko umieścił nową drabinkę foreach ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Hmm... Czyli mam tą linijkę rozpisać na foreach, tak?

Spróbuję i zaraz dam znać czy się udało :P

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jeśli to C# 4.5 to użyj metody Directory.EnumerateFiles

http://msdn.microsoft.com/en-us/library/dd997370.aspx

Jeśli wcześniejszy to masz problem z UnauthorizedAccessException

spróbuj tak:

 

private static void AddFiles(string path, IList<string> files)
{
   try
   {
       Directory.GetFiles(path)
           .ToList()
           .ForEach(s => files.Add(s));

       Directory.GetDirectories(path)
           .ToList()
           .ForEach(s => AddFiles(s, files));
   }
   catch (UnauthorizedAccessException ex)
   {
       // ok, so we are not allowed to dig into that directory. Move on.
   }
}

http://stackoverflow.com/questions/1393178/unauthorizedaccessexception-cannot-resolve-directory-getfiles-failure

 

stackoverflow - twoim największym przyjacielem :kwasny:

 

I popraw* obsługe exceptiona - nie robimy Pokemon Exception Handling, bo potem przychodzą do ciebie ludzie z działu utrzymania z widłami i płonącymi pochodniami... :lol2:

 

*nie łap wszystkich exceptionów tylko te które wiesz jak obsłużyć.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dzięki za odpowiedź ;)

 

Nie wiem tylko jak wywołać tą funkcję... Jaki ma być drugi argument?

AddFiles(Environment.GetEnvironmentVariable("windir"),JAKI_DRUGI_ARGUMENT?)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dzięki za odpowiedź ;)

 

Nie wiem tylko jak wywołać tą funkcję... Jaki ma być drugi argument?

AddFiles(Environment.GetEnvironmentVariable("windir"),JAKI_DRUGI_ARGUMENT?)

Sądzę że kolekcja w której chcesz trzymać listę plików, najpierw ją zainicjalizuj:

IList<IList<string>> files = new List<IList<string>>();

a potem użyj jako argument

AddFiles(Environment.GetEnvironmentVariable("windir"),files)

jak się funkcja wykona poprawnie to będziesz miał w files swoją listę plików.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Hmm... Spróbowałem jeszcze pobawić się EnumerateFiles

oto kod:

 private void AddFiles()
       {
           try
           {
               var files = from file in Directory.EnumerateFiles(Environment.GetEnvironmentVariable("windir"), "*.log", SearchOption.AllDirectories)
                           from line in File.ReadLines(file)
                           where line.Contains("Microsoft")
                           select new
                           {
                               File = file,
                               Line = line
                           };

               foreach (var f in files)
               {
                   MessageBox.Show(f.File, f.Line);
               }
               MessageBox.Show(files.Count().ToString());
               Console.WriteLine("{0} files found.", files.Count().ToString());
           }
           catch (UnauthorizedAccessException UAEx)
           {
               Console.WriteLine(UAEx.Message);
           }
           catch (PathTooLongException PathEx)
           {
               Console.WriteLine(PathEx.Message);
           }

wywala wyjątek:

An unhandled exception of type 'System.Windows.Markup.XamlParseException' occurred in PresentationFramework.dll

 

Additional information: Wywołanie konstruktora dla typu "Program.NET.MainWindow” zgodnego z określonymi ograniczeniami wiązania spowodowało wyjątek.

 

If there is a handler for this exception, the program may be safely continued.

Jeżeli zamiast .log, dam .exe wszystko działa... O co chodzi?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

http://stackoverflow.com/questions/16582374/an-unhandled-exception-of-type-system-windows-markup-xamlparseexception-occurr

 

Runtime XamlParseException is in most (if not all) cases an exception thrown from inside the constructor.

To solve it, you have to get the InnerException (and maybe its InnerException as well a.s.o.) and the callstack. Then fix it.

If the exception does not occur during debugging, you may try/catch the exception inside the constructor and log all necessary data.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...