Zapis do pliku tekstowego

0

Stworzyłem sobie w notatniku plik tekstowy, do którego skopiowałem jakąś ilość danych w formacie jedno słowo w jednej kolumnie. W C++/CLI nie mam problemów z odczytaniem go i skopiowaniem zawartości na różne wyświetlające formatki. Schody się zaczynają gdy chcę w pliku coś dodać i zapisać. Nadmienię, że plik jest jak najbardziej do zapisu i dostępny przez wszytskich uzytkowników (wielokrotnie to sprawdzałem). W moim przypadku powiększałem plik (dopisywałem nowe dane) poprzez zapis do tego pliku komórek z komponentu dataGridView:

StreamWriter^ moj_Plik=gcnew StreamWriter("dane.txt",0,System::Text::Encoding::Default);
for(int i=0;i<dataGridView1->Rowcount;i++)
 moj_Plik->WriteLine(dataGridView1->Rows[i]->Cells[0]->Value->ToString());
moj_Plik->Close();

Wszytsko jak najbardziej OK, kompilacja bez warningów tylę, że przy wykonywaniu wyskakuje następujący komunikat o wyjątku:

System.Unauthorized.AccessException Odmowa dostępu do ścieżki "C:\.....dane.txt"

Na wszelki wypadek potraktowałem ten plik na próbę fprintf()em i operatorem << z bibloteki fstream i ponownie nastąpił komunikat o odmowie dostępu do tego pliku. Pomyślałem, że może to jakieś systemowe działania antywirusa, który uniemożliwia robienie zapisów (mimo że plik jest otwarty do zapisywania) i na kopiach tego pliku potrenowałem na C++ Builderze i gcc. Na tamtych kompilatorach zapisywać jak najbardziej mogłem. Przyszło mi później do głowy, że może te całe Visual C++ ma jakąś blokadę/buga co do zapisów i otworzyłem dla sprawdzenia nowy projekt i sobie pozapisywałem używając ponownie bibliotek ze <studio.h> i <fstream>, tym razem wszystko zapisywało się bez problemów. Wychodzę, więc z założenia że coś jest skopane jest gdy trzeba zapisywać nowe dane w już istniejącym pliku, lub pliku który został utworzony przez użytkownika nie kodem a na zasadzie Nowy->Dokument tekstowy. Ktoś spotkał się z czymś podobnym i przy okazji wie jak tą blokadę zapisywania ominąć?

1

Odpal program w trybie administratora.

0
_13th_Dragon napisał(a):

Odpal program w trybie administratora.

Dzięki. Pomogło. Chociaż to trochę dziwne, bo we właściwościach i praktyce, każdy użytkownik może go (plik) modyfikować (zapisywać), a nawet usuwać. Przydały by się funkcje/klasy w Visual C++ odpowiadające linuksowemu - chmod.

1

Zwyczajnie zapisuj na "%APPDATA%\\dane.txt" i pozamiatane.

0

Zrób tak:
Otwórz dysk C, właściwości, zabezpieczenia
Otwórz dysk D, właściwości, zabezpieczenia
Porównaj oba dyski

Zakładam że chcesz zapisać w głównym folderze dysku.
Nie pamiętam od której wersji systemu ale pozmieniali i teraz trzeba trochę wyższych uprawnień aby zapisać tam gdzie się nie powinno zapisywać.

Przydały by się funkcje/klasy w Visual C++ odpowiadające linuksowemu - chmod
Lepiej nie kompilować sobie życia ponad miarę , nawet jak odczytasz uprawnienia to nic Ci to nie da

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