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#]Listowanie plików w katalogu.

Rekomendowane odpowiedzi

Witam, udało mi się sklecić coś takiego:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Windows;
using System.Windows.Input;


namespace ConsoleApplication1
{
   class Program
   {
       static void Main(string[] args)
       {
           int licz = 0;
           string zmiennasrodowisk = Environment.GetEnvironmentVariable("Temp"); // pobranie ścieżki temp'a do stringa
           string[] filePath;
           do
           {
               filePath = Directory.GetFiles(zmiennasrodowisk); //listowanie plików w tempie
               ++licz;
           } while (licz == 5);
           Console.WriteLine(zmiennasrodowisk);
           Console.WriteLine(filePath);
           Console.ReadLine();
       }
   }
}

 

Tak, wiem ta pętla nie jest za dobra, ale jest tymczasowa dla testu...(potem nad tym pomyślę) Problem tkwi w tym, że funkcja listująca pliki nie zwraca mi ścieżek plików... W czym jest problem ?

 

Proszę o pomoc ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Console.WriteLine() wywołuje na obiekcie metodę ToString(), chyba że przekażesz stringa to od razu go wykorzysta. W Twoim kodzie do WriteLine() przekazujesz tablicę, więc w ToString() będzie wyświetlony typ. Żeby wyświetlić wszystkie stringi w tablicy, sam musisz o to zadbać. Dla każdego elementu tablicy wywołujesz WriteLine(). Pętla którą masz jest w ogóle niepotrzebna. Tylko raz przecież chcesz pobrać spis plików.

 

Zamiast

Environment.GetEnvironmentVariable("Temp");

używaj

Path.GetTempPath();

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

A no raz... Przyzwyczajenie z C++ :E Tam potrzebna pętla :E

 

Czyli coś takiego:

Console.WriteLine(filePath[1]);

Jednak... ja chcę, żeby wszystko zostało wyświetlone... można to jakoś prosto zapisać ? Czy potrzebna pętla, która będzie dodawała ciągle +1, aż skończą się pliki ?

 

 

EDIT: jak użyję tego co piszesz wywala:

Błąd	1	'Path' is an ambiguous reference between 'System.IO.Path' and 'System.Windows.Shapes.Path'34	43

 

Czemu nie powinienem używać

                string zmiennasrodowisk = Path.GetTempPath(); // pobranie ścieżki temp'a do stringa

?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Pętla która dodaje ciągle +1... masz na myśli "for". W tym przypadku lepsza jest "foreach". Poszukaj, zobacz przykłady.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ok, zakodziłem coś takiego:

           string zmiennasrodowisk = Environment.GetEnvironmentVariable("Temp"); // pobranie ścieżki temp'a do stringa
               string[] filePath = Directory.GetFiles(zmiennasrodowisk); //listowanie plików w tempie

               foreach (string Path in filePath) //czy to znaczy, że mam zapisywać dane z filePath do Patch, aż elementy w filePath się skończą ? Dobrze rozumiem ?
               {
                   MessageBox.Show(Path.ToString());
               }

 

Dobrze rozumuje ?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

1. Zapisz z pełną nazwą jeśli jest konflikt: System.IO.Path.GetTempPath(). Dlaczego ta metoda? Google :)

2. "Dobrze rozumiem ?" Tak.

3. Path.ToString(), ToString() jest zbędne. wystarczy Show(path). Zmienną lokalną zapisuje się według konwencji z małej litery.

4. Nie chcesz chyba wyświetlać pełno okienek za pomocą Show() w pętli... (wcześniej była mowa o Console.WriteLine()). W takim przypadku złącz wszystkie napisy przed wyświetleniem z dodaniem znaku nowej linii. Jak? Google :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Hmm... Chcę usuwać pliki, z folderu temp, zrobiłem coś takiego:

            if(Temp.IsChecked == true)
           {
               string zmiennasrodowisk = System.IO.Path.GetTempPath(); // pobranie ścieżki temp'a do stringa
               string[] filePath = Directory.GetFiles(zmiennasrodowisk); //listowanie plików w tempie

               foreach (string Path in filePath) //powtarzaj przeszukiwanie w filepath i zapisuj do Path, az w filePath skoncza sie sciezki i zapisz dane do string Path
               {
                  File.Delete(Path); //usun pliki ze scieszki stringPath czyli folder temp
               } 

           } 

 

Ale program, kiedy nie może uzyskać dostępu do jakiegoś pliku, to zawiesza się :(, Czemu nie pominie tego pliku ?

 

 

EDIT: Już sobie poradziłem ;) Kluczem było try i catch! :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Hmm... Chcę usuwać pliki, z folderu temp, zrobiłem coś takiego:

            if(Temp.IsChecked == true)
           {
               string zmiennasrodowisk = System.IO.Path.GetTempPath(); // pobranie ścieżki temp'a do stringa
               string[] filePath = Directory.GetFiles(zmiennasrodowisk); //listowanie plików w tempie

               foreach (string Path in filePath) //powtarzaj przeszukiwanie w filepath i zapisuj do Path, az w filePath skoncza sie sciezki i zapisz dane do string Path
               {
                  File.Delete(Path); //usun pliki ze scieszki stringPath czyli folder temp
               } 

           } 

 

Ale program, kiedy nie może uzyskać dostępu do jakiegoś pliku, to zawiesza się :(, Czemu nie pominie tego pliku ?

 

 

EDIT: Już sobie poradziłem ;) Kluczem było try i catch! :)

 

try i catch sa bardzo kuszace bo pozwalaja na latwe przechwytywanie exceptionów, ale też sprawiaja że trudniej rozpoznać jakie błędy popełniamy i gdzie. Powinny byc tylko uzywane w stanach niepewności czyli np przy nawiazywaniu polaczenia, nie powinno sie tego uzywac jako wielkiej łaty wyłapującej exceptiony, pozwalajacej by program dzialal dalej mimo ze moze nie wykonywac lub wykonuje zle czesc swoich zadan. try i catch jesli natrafia na exception to pomijaja caly blok kodu znajdujacy sie w zakresie try. W tym przypadku uzyl bym zwyklego ifa ktory by sprawdzal czy plik istnieje, jesli tak to kasuje, jesli nie to idzie dalej.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nataq +1

 

try.. catch używamy tam, gdzie programista nie jest w stanie zapewnić powodzenia operacji, gdyż zależy to od czynników zewnętrznych - co wprowadzi user, czy uda się nawiazać połączenie. I należy nim otaczać tylko fragmenty kodu które mogą powodować problem - nie cały program :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ja w VB.Net miałem to zrobione w taki sposób, analogicznie będzie w C# :)

 


       ' tworzysz reference do folderu '

       Dim sciezka As String ' tutaj masz ścieżkę do Twojego folderu '
       Dim dajrektoryinfo As New IO.DirectoryInfo(sciezka)
       Dim d1 As IO.FileInfo() = dajrektoryinfo.GetFiles()
       Dim fileinfos As IO.FileInfo

       'wypisanie wszystkich plików w danym folderze'

       For Each fileinfos In d1
           Console.WriteLine(sciezka & "\" & fileinfos.ToString)
       Next

 

Działanie:

 

1400234208-clip-43kb.png

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Zrobiłem coś takiego:

string zmiennasrodowisk = System.IO.Path.GetTempPath(); // pobranie ścieżki temp'a do stringa
               string[] filePath = Directory.GetFiles(zmiennasrodowisk); //listowanie plików w tempie
               foreach (string Path in filePath) //powtarzaj przeszukiwanie w filepath i zapisuj do Path, az w filePath skoncza sie sciezki i zapisz dane do string Path, (usuwanie plikow)
               {
                   try //gdyby cos poszlo nie tak....
                   {
                       File.Delete(Path); //usun pliki ze scieszki stringPath czyli folder temp

                   }
                   catch //wykonaj to...
                   {

                   }
               }

 

Nie wiem jak ty to chcesz zapisać ifem @Nataq, bo program wysypie się jeśli plik istnieje, ale nie można go usunąć bo inny program go używa.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
W tym przypadku uzyl bym zwyklego ifa ktory by sprawdzal czy plik istnieje

 

To jednak nie wyczerpuje przypadków, gdy delete może zawieść.

 

http://msdn.microsoft.com/pl-pl/library/system.io.file.delete%28v=vs.110%29.aspx

 

W szczególności IOException i UnauthorizedAccessException mogą być problemem. I tu jak najbardziej stosowanie Exceptionów ma sens - spodziewasz się, że uda się plik usunąć, niemożność usunięcia jest sytuacją wyjątkową. Poza tym pliki są brane z GetFiles, więc można rozsądnie oczekiwać że istnieją, bo raczej mało prawdopodobne, by coś je usunęło w trakcie.

 

A propos GetFiles. Od Frameworka 4.0 jest lepsza metoda EnumerateFiles:

 

http://msdn.microsoft.com/pl-pl/library/dd383458%28v=vs.110%29.aspx

 

Różnica jest taka, że można iterować po kolekcji jeszcze zanim zwracanie plików się skończy. Przy GetFiles musisz czekać, aż całe przeglądanie się skończy, a przy dużych folderach może to potrwać.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

trudno mi rozgryźć specyfike C# no i foreach nie bardzo łapie funkcja Path zwraca

w C z użyciem np. WinAPI (FindFirstFile, FindNext, FindClose) żeby operować przeszukując na strukturze folderów są dwa podstawowe algorytmy:

 

jeden używa Windows do szukania(ten gorszy :P)

Ty zdaje się go używasz

 

1. utwórz liste "wyniki", dodaj do wyników katalog jaki chcesz przeskanować
będzie jednoelementowa lista,
2. ustaw indeks startowy na pierwszy element listy
3. sprawdź w pętli for z warunkiem czy indeks < ilość elementów
 { if przeszukaj katalog aktualną ścieżkę na jaką wskazuje indeks jeśli jest katalogiem, dodając liste znalezisk do listy "wyniki"
else jeśli jest plikiem nic nie rób 
zwiększ indeks
continue;
}
4. wyświetl wyniki przeszukań
5. zaczynając od konca pętluj i usuwaj
lub zaczynając od początku - jeśli byś chciał kopiować 
i moze w kolejnosci tkwi błąd lub funkcja której używasz nie usuwa podkatalogów na nich zwraca błąd?

 

drugi wymaga conajmniej operowania na dwóch listach, "wyniki" i "stosie" oraz dwóch funkcji

jest lepszy bo bardziej intuicyjny, być może też szybszy :P

 

ale "opatentowany" więc... nie będe wspierał konkurencji :D

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Eh :P

 

W C++ użyłbym czegoś takiego :P

   char AppDataFolder[MAX_PATH];
   SHGetFolderPathA(0, CSIDL_LOCAL_APPDATA, 0,  NULL, AppDataFolder);
   string temp, temp2, temp3;
   temp2 = AppDataFolder;
   temp = temp2 + "\\Temp\\*.*";
   temp3 = temp2 + "\\Temp\\";
   _finddata_t danePliku;
   long uchwyt = _findfirst( temp.c_str(), & danePliku );
   int SzukamDalej = _findnext( uchwyt, & danePliku );
   string log, usun;
      do{
        SzukamDalej = _findnext( uchwyt, & danePliku );
        remove (usun.c_str()); //usuwanie
        RemoveDirectoryA(usun.c_str());
        usun = temp3 + danePliku.name;
        }while(SzukamDalej != -1);

 

Czy to jest szybsze ? Sam nie wiem... W każdym bądź razie w C# wygodniej się pisze :P

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

mój w każdym razie działaŁ :P

fakt że tylko w konsolowej wersji bo GUI zniszczyłem :lol2: (straszne co GNU robi z człowiekiem)

https://dl.dropboxusercontent.com/u/10755180/PC/Koperek/Readme.html

 

w kodzie C masz jednaak ogromniastego babola bo:

RemoveDirectory

The path of the directory to be removed. This path must specify an empty directory, and the calling process must have delete access to the directory.

http://msdn.microsoft.com/en-us/library/windows/desktop/aa365488%28v=vs.85%29.aspx

i jasne że wygodniej się pisze mając gotowce :Up_to_s:

ja takich nie mialem

 

z szybkością może przesadziłem, bardziej mnie przekonuje sposób posortowania wyników i wygode w operacjach kopiowania i "dziedziczenia" w potwierdzaniu, a jeśli już chciałbym usprawnić operacje na plikach to użyłbym SHFileOperation - wszystko w jednym ;)

chciałem "niskopoziomowo" usprawnić windowsowy proces na plikach w Windows 98 i 2000 które kopiowanie miało zrypane(buforowanie) i prawie wyszedł by Copy Handler, TeraCopy, RoboCopy a został z założeń jedynie niski poziom :lol2:

 

działaj działaj, jak na początkującego masz świetne podejście i robisz szybkie postępy

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Hmm... Może to nie związane z tematem, ale... mam pytanie :E

 

Znalazłem coś takiego odnośnie dodawania tekstu do textBoxa w osobnym wątku:

textBox1.Invoke(new Action(() =>
       {
           textBox1.Text = "(New Text)";
       }));

 

Jednak z tego co wyczytałem to jest do Windows Forms, a ja potrzebuje tego w WPF...

Nic znaleźć na ten temat nie mogę :/, pomoże ktoś ?

 

EDIT: Jeśli użyje standardowo textBox1.Text = "(New Text)"; program się sypnie...

 

EDI2:

Dałem już radę :D

Dispatcher.Invoke(new Action(delegate { Text.Text += "Test" ; })); //tak musi być w osobnym wątku, przy wyświetlaniu tekstu w wątku głównym

 

Dobrze czy jak zwykle zostawiam jakąś dziurę :E ?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Bo nie można manipulować kontrolkami bezpośrednio z innego wątku, od tego właśnie jest invoke w formsach.

 

W WPF też to masz, tylko tym razem jako Dispatcher.Invoke w kontrolce.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Mam jeszcze jedno pytanko:

Jak przez funkcję:

string[] Path = Directory.GetDirectories(Path2);

 

Uzyskać samą nazwę folderu bez ścieżki ?

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ę...