Klasa Plik i metoda odczytywania

0

Witam serdecznie. Piszę aplikację Metro. Natrafiłem na mały problem i proszę was o pomoc. Stworzyłem taką oto klasę:


 class Plik
    {

        public string SciezkaPlikuUsuwania;
        public string SciezkaPlikuZapisu;
        public string SciezkaPlikuOdczytu;
        public string OdczytPliku;
        public string ZapisPliku;

        public Plik(string Spu, string Spz, string Spo, string Op, string Zp)
        {
            SciezkaPlikuUsuwania = Spu;
            SciezkaPlikuZapisu = Spz;
            SciezkaPlikuOdczytu = Spo;
            OdczytPliku = Op;
            ZapisPliku = Zp;
        }
        public async void Usun(string sciezkaPlikuUsuwania)

        {
            SciezkaPlikuUsuwania = sciezkaPlikuUsuwania;

            StorageFolder local = ApplicationData.Current.LocalFolder;

            var _File1 = await local.GetFileAsync(SciezkaPlikuUsuwania);

            await _File1.DeleteAsync(StorageDeleteOption.PermanentDelete);
        }
        public async void Wczytaj(string sciezkaPlikuOdczytu)
        {
            SciezkaPlikuOdczytu = sciezkaPlikuOdczytu;

            StorageFolder local = ApplicationData.Current.LocalFolder;

            bool fileExists1;                       

            try // Sprawdzanie czy pliki istnieją:
            {
                StorageFile _File1Check = local.GetFileAsync(SciezkaPlikuOdczytu).AsTask().ConfigureAwait(false).GetAwaiter().GetResult();
                fileExists1 = _File1Check != null;
            }
            catch
            {
                fileExists1 = false;
            }

            if (fileExists1 == false) //Jeżeli nie istnieje tworzymy plik
            {

                byte[] fileBytes1 = System.Text.Encoding.UTF8.GetBytes("Empty".ToCharArray());

                var file1 = await local.CreateFileAsync(SciezkaPlikuOdczytu,
                CreationCollisionOption.ReplaceExisting);

                using (var s = await file1.OpenStreamForWriteAsync())
                {
                    s.Write(fileBytes1, 0, fileBytes1.Length);
                }
            }
            else //Jeżeli istnieje odczytujemy
            {
                var _File1 = await local.OpenStreamForReadAsync(SciezkaPlikuOdczytu);

                using (StreamReader streamReader1 = new StreamReader(_File1))
                {
                    OdczytPliku = streamReader1.ReadToEnd();
                    OdczytPliku.ToString();
                }
            }
        }
        public async void Zapisz(string sciezkaPlikuZapisu)
        {           
            StorageFolder local = ApplicationData.Current.LocalFolder;

            SciezkaPlikuZapisu = sciezkaPlikuZapisu;

            byte[] fileBytes = Encoding.UTF8.GetBytes(ZapisPliku.ToCharArray());

            var file = await local.CreateFileAsync(SciezkaPlikuZapisu,
                CreationCollisionOption.ReplaceExisting);

            using (var s = await file.OpenStreamForWriteAsync())
            {
                s.Write(fileBytes, 0, fileBytes.Length);
            }
        }     
    }
}

No i prawie to wszystko działa ;) Mam problem tylko z odczytywaniem.


 else //Jeżeli istnieje odczytujemy
            {
                var _File1 = await local.OpenStreamForReadAsync(SciezkaPlikuOdczytu);

                using (StreamReader streamReader1 = new StreamReader(_File1))
                {
                    OdczytPliku = streamReader1.ReadToEnd();
                    OdczytPliku.ToString();
                }
            }

A konkretnie ze zmienną OdczytPliku. Chciałbym muc przekazać dane z tejże zmiennej do zmiennej w MainPage lub się do niej odwołać.
Prosiłbym was o pomoc bo znając życie sprawa jest błaha a męczę się już z tym jakiś czas:(

1

return OdczytPliku.ToString() po sekcji using (StreamReader...)? I wtedy ci to zwróci jako wynik działania twojej funkcji i możesz użyć gdziekolwiek w postaci:

var f = new Plik();
string x = OdczytPliku("cośtam");

Tylko musisz zmienić typ OdczytPliku na Task<string> zamiast void.

Aczkolwiek twój kod ma inne problemy - skoro konstruktor oczekuje wszystkich nazw plików (po co, BTW?) to po co poszczególne metody też ich potrzebują? Jedno albo drugie, lepiej aby metody tego potrzebowały tylko.

0

Próbowałem zwrócić wynik ale używałem void zamiast Task :) (No i kompilator wywalał mi błąd) A co masz na myśli mówiąc ze jedno albo drugie? Jak bede miał chwile przysiądę do komputera i spróbuje poprawić te funkcje. Dzięki za pomoc :)

0

void nie zwraca wyniku. Dosłownie zwraca pustkę. A Task<string> oznacza, że wynikiem jest ciąg znaków (ale metoda jest asynchroniczna, dlatego musi być Task<string>, a nie samo string).

Mam na myśli to, że obecnie twój program działa tak:

var p =  new Plik("plik1", "plik2", "plik3");
p.OdczytajPlik("plik2");

Po co dwa razy podawać nazwę pliku do odczytu/zapisu?

0

Wita Ponownie. Kombinuje na wszystkie strony.. chyba to dla mnie za wysoka półka.. Kolejny raz proszę o pomoc :) Wystrugałem coś takiego:


 class Plik
    {

        public string SciezkaPlikuUsuwania;
        public string SciezkaPlikuZapisu;
        public string SciezkaPlikuOdczytu;
        public Task <string> OdczytPliku;
        public string ZapisPliku;

        public Plik(string Spu, string Spz, string Spo, string Zp)
        {
            SciezkaPlikuUsuwania = Spu;
            SciezkaPlikuZapisu = Spz;
            SciezkaPlikuOdczytu = Spo;
            ZapisPliku = Zp;
        }
        public async void Usun(string sciezkaPlikuUsuwania)

        {
            SciezkaPlikuUsuwania = sciezkaPlikuUsuwania;

            StorageFolder local = ApplicationData.Current.LocalFolder;

            var _File1 = await local.GetFileAsync(SciezkaPlikuUsuwania);

            await _File1.DeleteAsync(StorageDeleteOption.PermanentDelete);
        }
        public async Task<string> Wczytaj(string sciezkaPlikuOdczytu)
        {
            SciezkaPlikuOdczytu = sciezkaPlikuOdczytu;

            StorageFolder local = ApplicationData.Current.LocalFolder;

            bool fileExists1;

            try // Sprawdzanie czy pliki istnieją:
            {
                StorageFile _File1Check = local.GetFileAsync(SciezkaPlikuOdczytu).AsTask().ConfigureAwait(false).GetAwaiter().GetResult();
                fileExists1 = _File1Check != null;

            }
            catch
            {
                fileExists1 = false;
            }

            if (fileExists1 == false) //Jeżeli nie istnieje tworzymy plik
            {

                byte[] fileBytes1 = System.Text.Encoding.UTF8.GetBytes("Empty".ToCharArray());

                var file1 = await local.CreateFileAsync(SciezkaPlikuOdczytu,
                CreationCollisionOption.ReplaceExisting);

                using (var s = await file1.OpenStreamForWriteAsync())
                {
                    s.Write(fileBytes1, 0, fileBytes1.Length);

                    return null;
                }
            }
            else //Jeżeli istnieje odczytujemy
            {

                var _File18 = await local.OpenStreamForReadAsync(SciezkaPlikuOdczytu);

                using (StreamReader streamReader1 = new StreamReader(_File18))
                {
                    OdczytPliku = streamReader1.ReadToEnd();

                    return OdczytPliku.ToString();

                }
            }            
       }
        public async void Zapisz(string sciezkaPlikuZapisu)
        {           
            StorageFolder local = ApplicationData.Current.LocalFolder;

            SciezkaPlikuZapisu = sciezkaPlikuZapisu;

            byte[] fileBytes = Encoding.UTF8.GetBytes(ZapisPliku.ToCharArray());

            var file = await local.CreateFileAsync(SciezkaPlikuZapisu,
                CreationCollisionOption.ReplaceExisting);

            using (var s = await file.OpenStreamForWriteAsync())
            {
                s.Write(fileBytes, 0, fileBytes.Length);
            }
        }     
    }
}

Teraz mam problem z przekonwertowaniem tego :


                    OdczytPliku = streamReader1.ReadToEnd(); //nie można niejawnie przekonwertować typu string na System Threading Task. 

                    return OdczytPliku.ToString();
0

Witam ponownie. Poprawiłem kod według twoich wskazówek:


 public async Task<string> Wczytaj(string loadPath)
        {
            LoadPath = loadPath;

            StorageFolder local = ApplicationData.Current.LocalFolder;

            bool fileExists1;

            try // Sprawdzanie czy pliki istnieją:
            {
                StorageFile _File1Check = local.GetFileAsync(LoadPath).AsTask().ConfigureAwait(false).GetAwaiter().GetResult();
                fileExists1 = _File1Check != null;

            }
            catch
            {
                fileExists1 = false;
            }

            if (fileExists1 == false) //Jeżeli nie istnieje tworzymy plik
            {

                byte[] fileBytes1 = System.Text.Encoding.UTF8.GetBytes("Empty".ToCharArray());

                var file1 = await local.CreateFileAsync(LoadPath,
                CreationCollisionOption.ReplaceExisting);

                using (var s = await file1.OpenStreamForWriteAsync())
                {
                    s.Write(fileBytes1, 0, fileBytes1.Length);

                    return null;
                }
            }
            else //Jeżeli istnieje odczytujemy
            {

                var _File18 = await local.OpenStreamForReadAsync(LoadPath);

                using (StreamReader streamReader1 = new StreamReader(_File18))
                {
                    var SaveFile = streamReader1.ReadToEnd();
                    Save = SaveFile.ToString();                 
                    return Save;

                }
            }

Teraz wygląda to tak że Zmienna Save posiada zwartość pliku ale... przy wywołaniu w ten sposób:


  string SC = "Ikona1.txt";

  var Nowy = new Plik();
  {                             
   string x = await Nowy.Wczytaj(SC);
  }

zwraca wartość null. Jeżeli dobrze rozumiem to string x powinien posiadać wartość pliku Ikona1.txt ale jej nie posiada. Proszę o pomoc w znalezieniu błędu lub czy ta metoda ma prawo działać bo już nie wiem sam...

0

Okazuje się że kompilator wyświetlał podczas debugowania null ale tak naprawdę wartość była odczytywana i przypisana do stringa x. Temat do zamknięcia. Dzięki za pomoc Ktos, pozdrawiam :)

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