CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Zapis ścieżki do pliku w Windows 7

Zapis ścieżki do pliku w Windows 7

dział ogólny

Zapis ścieżki do pliku w Windows 7

Nowy postprzez Pitek » piątek, 17 grudnia 2010, 20:58

Witam!
Mam problem związany(a przynajmniej tak mi się wydaje bo ja już nie wiem co to może być) z poprawnym zapisem ścieżki dostępu do pliku do stringa.
Mam coś takiego :

KOD cpp:     UKRYJ  
char nazwausera[_MAX_PATH];
DWORD size = sizeof(nazwausera);
if(GetUserName(nazwausera, &size));
lokalizacja = tab[0]+"Users\\"+nazwausera+"\\AppData\\Roaming\\Ventrilo\\ventrilo2.ini";


Gdzie :

KOD cpp:     UKRYJ  
tab[0] = "C:\\";


Pojawia się błąd na Windows 7 o treści :
Ta ścieżka powyżej + Is not valid integer point value.

Nie mam pojęcia dlaczego się tak dzieje ponieważ zmienna lokalizacja jest typu String i nigdzie nie konwertuje jej na integer'a.
Bardzo proszę o jakieś wskazówki gdzie szukać błędu lub jaki kod mam podać.

Pozdrawiam pitek3010
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows XPFirefox

Re: Zapis ścieżki do pliku w Windows 7

Nowy postprzez Cyfrowy Baron » piątek, 17 grudnia 2010, 21:28

Co to za cudo:

KOD cpp:     UKRYJ  
tab[0] = "C:\\";


Jakim typem jest tab? Czy to zmienna char o rozmiarze 0, czy pierwszy element jakiejś tablicy? W jaki sposób zapisujesz ścieżkę dostępu do pliku, bo tutaj nic na ten temat nie ma?
Nie można zmiennej char dodawać do wartości typu String tak jak Ty to tutaj robisz, trzeba prze-konwertować char na String:

KOD cpp:     UKRYJ  
lokalizacja = "Users\\" + (String)nazwausera + "\\AppData\\Roaming\\Ventrilo\\ventrilo2.ini";


Celowo w powyższym przykładzie nie dodałem do całości tab[0], gdyż nie wiem czym to coś jest.

Poza tym w do określenia rozmiaru zmiennej nazwausera lepiej jest użyć wartości 32767.
Dlaczego na końcu warunku masz średniki: if(GetUserName(nazwausera, &size)); linie kodu poniżej nie odnoszą się już do warunku gdyż brak nawiasów. To dokładnie tak samo jakbyś zapisał:

KOD cpp:     UKRYJ  
if(GetUserName(nazwausera, &size))  {  ;  }
lokalizacja = tab[0]+"Users\\"+nazwausera+"\\AppData\\Roaming\\Ventrilo\\ventrilo2.ini";


Widzisz w czym problem?

Poprawnie powinno być tak:

KOD cpp:     UKRYJ  
#define INFO_BUFFER_SIZE 32767

TCHAR nazwausera[INFO_BUFFER_SIZE];
DWORD size = INFO_BUFFER_SIZE;

if(GetUserName(nazwausera, &size))
  lokalizacja = /* tab[0]+ */ "Users\\" + (String)nazwausera + "\\AppData\\Roaming\\Ventrilo\\ventrilo2.ini";
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Zapis ścieżki do pliku w Windows 7

Nowy postprzez Pitek » piątek, 17 grudnia 2010, 21:44

Obiekt tab[0] to element tablicy typu String.
Nie mam jeszcze możliwości przetestować tego na Win 7 muszę czekać na kumpla.
Czy jest to możliwe aby błędy które Pan mi poprawił mogły wywoływać tego typu błąd programu ?
Ewentualnie jeszcze posyłam Panu na mejla ten cały projekt gdyż nie chcę aby był on ogólnie dostępny a nie wiem gdzie ten błąd może leżeć i jakie kody tutaj jeszcze pokazać.
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows XPFirefox

Re: Zapis ścieżki do pliku w Windows 7

Nowy postprzez Cyfrowy Baron » piątek, 17 grudnia 2010, 22:35

Czy jest to możliwe aby błędy które Pan mi poprawił mogły wywoływać tego typu błąd programu ?


Na pewno dodanie zmiennej typu char do String bez konwersji wywoła błąd.

Nie mam jeszcze możliwości przetestować tego na Win 7 muszę czekać na kumpla.


System nie ma tutaj nic do rzeczy, kod nie będzie działał prawidłowo zarówno w Win XP jak i 7.



Co do zmiennej tab, to podałeś za mało informacji. Jak deklarujesz tą tablicę? Jak ją wypełniasz wartościami?
Wciąż nie odpowiedziałeś na pytanie, jak zapisujesz to do pliku! :evil:
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Zapis ścieżki do pliku w Windows 7

Nowy postprzez Pitek » sobota, 18 grudnia 2010, 00:46

Podaję przykład mojego kodu (całość posłałem na e-mail) :
KOD cpp:     UKRYJ  
//--------------------------------
void __fastcall TForm3::Button1Click(TObject *Sender)
{
#define INFO_BUFFER_SIZE 32767
TCHAR nazwausera[INFO_BUFFER_SIZE];
String tab[1];
String lokalizacja;
fileName = ExtractFilePath(ParamStr(0)) + "settings.ini";
tab[0] = "C:\\";
DWORD size = INFO_BUFFER_SIZE;

TStringList *Ustawienia = new TStringList;

if(GetUserName(nazwausera, &size))
{
        lokalizacja = tab[0]+"Users\\"+(String)nazwausera+"\\AppData\\Roaming\\Ventrilo\\ventrilo2.ini";
}
Ustawienia->Add(lokalizacja);
Ustawienia->SaveToFile(fileName);
delete Ustawienia;
}
//--------------------------------

Bardzo Pana proszę o przeglądnięcie tego co posłałem na e-mail ponieważ dochodzenie tutaj co jest nie tak podejrzewam że nie będzie proste bo nie wiem czy to w ogóle w tym zdarzeniu czy to jakiś głębszy błąd.
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows XPFirefox

Re: Zapis ścieżki do pliku w Windows 7

Nowy postprzez polymorphism » sobota, 18 grudnia 2010, 11:18

Tak będzie pewniej:
KOD cpp:     UKRYJ  
#include <cstdlib>
...

string app_path;

char* p = getenv("APPDATA");
if(p) app_path.append(p).append("\\Ventrilo\\ventrilo2.ini");

cout << app_path << '\n';

Przyjąłeś naiwne założenie, że układ katalogów w WinXP i Win7/Vista jest taki sam.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Zapis ścieżki do pliku w Windows 7

Nowy postprzez Cyfrowy Baron » sobota, 18 grudnia 2010, 11:22

Co się tyczy programu, który przesłałeś mi na e-mail to mógłbym mu wiele zarzucić, np. to że powtarzasz bloki kodu, np. funkcja pobierająca informacje o wersji systemu (SystemInfo()) występuj w jednostce Unit1.cpp i Unit3.cpp, a przecież wystarczy ją raz zdefiniować i używać wielokrotnie. W takim celu najlepiej stworzyć jeden plik (moduł) zawierający wiele powtarzających się funkcji i dołączać go do wszystkich jednostek, które potrzebują funkcji w nim zawartych. Proponuję byś zapoznał się w serwisie Cyfrowy Baron z poradą: teoria -> tworzenie modułów.

Twój program skompilował się u mnie bez problemu, więc błędów jako takich nie zawiera, jednak w zdarzeniu OnShow dla formularza Form1 (Unit1) wczytujesz plik z określonej lokalizacji, jednak gdy tego pliku nie ma to program zgłasza błąd. Powinieneś sprawdzać czy taki plik istnieje, bo jeżeli plik nie istnieje, to wykonywanie dalszych operacji nie ma sensu:

KOD cpp:     UKRYJ  
void __fastcall TForm1::FormShow(TObject *Sender)
{
wersja = GetFileVersionInfo(NULL, "FileVersion");
fileName = ExtractFilePath(ParamStr(0)) + "settings.ini";

if(!FileExists(fileName))
{
Timer1->Enabled = true;
 ShowMessage("Zainstaluj Ventillo");
 return; // <-- tutaj przerywam wykonywanie dalszych operacji
}
/* blok else staje się zbędny, dalszy kod może być poza tym blokiem */
 //...




Co się tyczy Twojego problemu, to oczywiście kod, który przytoczyłeś w swoim ostatnim poście u mnie działa bezbłędnie, nie naniosłeś jednak tych poprawek do swojego programu.
Drobna uwaga odnośnie definicji:

KOD cpp:     UKRYJ  
#define INFO_BUFFER_SIZE 32767


takich definicji nie umieszcza się wewnątrz funkcji, gdyż tracą na swoim znaczeniu. takie zmienne definiujesz gdzieś na początku pliku źródłowego, np:

KOD cpp:     UKRYJ  
#pragma resource "*.dfm"
#define INFO_BUFFER_SIZE 32767

TForm1 *Form1;


dzięki temu są dostępne dla wszystkich funkcji.
W przytoczonym przez Ciebie przykładzie można po prostu zrezygnować z definicji i wpisać rozmiar jawnie, jeżeli nie potrzebujesz tego rozmiaru nigdzie więcej, czyli:

KOD cpp:     UKRYJ  
TCHAR nazwausera[32767];
DWORD size = 32767;
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Zapis ścieżki do pliku w Windows 7

Nowy postprzez Cyfrowy Baron » sobota, 18 grudnia 2010, 11:38

polymorphism napisał(a):Przyjąłeś naiwne założenie, że układ katalogów w WinXP i Win7/Vista jest taki sam.


Na to akurat nie zwróciłem uwagi, ale w Windows XP nie ma takich katalogów jak tutaj podano. Najwyraźniej pitek3010 chce by jego program działał tylko w Win7. By ta aplikacja działała we wszystkich systemach trzeba prawidłowo pobrać ścieżkę do katalogu specjalnego, czyli tutaj do jak sądzę do katalogu: Documents and Settings\<user name>\Dane aplikacji, co w Win7 odpowiada: Users\<user name>\AppData\.

Można to zrobić tak jak podał polymorphism, co ze względu na użytą zmienną typu string, może niektórym nastręczać problemu, ale można też zrobić to równie dobrze tak:

KOD cpp:     UKRYJ  
#include <shlobj.h>

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 TStringList *Ustawienia = new TStringList;

 String lokalizacja;
 String fileName = ExtractFilePath(ParamStr(0)) + "settings.ini";

 wchar_t SpecDir[MAX_PATH];

 if( SHGetSpecialFolderPath(NULL, SpecDir, CSIDL_APPDATA, 0) )
 {
  lokalizacja = (String)SpecDir + "\\Roaming\\Ventrilo\\ventrilo2.ini";
 }
 else
 {
  ShowMessage("Bład pobierania nazwy katalogu");
  delete Ustawienia;
  return;
 }

 Ustawienia->Add(lokalizacja);
 Ustawienia->SaveToFile(fileName);

 delete Ustawienia;
}


Końcowy efekt będzie identyczny.



► patrz serwis: Cyfrowy Baron dział: porady -> API -> Ścieżki dostępu do katalogów specjalnych.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Zapis ścieżki do pliku w Windows 7

Nowy postprzez Cyfrowy Baron » sobota, 18 grudnia 2010, 11:48

Jeszcze jedno. Do zapisywania danych do pliku nie trzeba od razu tworzyć obiektu typu TStringList. C++Builder udostępnia kilka prostych funkcji, które pozwalają zapisać szybko dane do pliku:

KOD cpp:     UKRYJ  
#include <shlobj.h>

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 String lokalizacja;
 String fileName = ExtractFilePath(ParamStr(0)) + "settings.ini";

 int iFileHandle = FileCreate(fileName);

 wchar_t SpecDir[MAX_PATH];

 if( SHGetSpecialFolderPath(NULL, SpecDir, CSIDL_APPDATA, 0) )
 {
  lokalizacja = (String)SpecDir + "\\Roaming\\Ventrilo\\ventrilo2.ini";

  int iLength = lokalizacja.Length() * sizeof(wchar_t);
  FileWrite( iFileHandle, lokalizacja.w_str(), iLength );
 }
 else
 {
  ShowMessage("Bład pobierania nazwy katalogu");
  FileClose( iFileHandle );
  return;
 }
 FileClose( iFileHandle );
}
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 1 gość

cron