problem z dodaniem stringów

0

witam,
sprawa wydaje się trywialna - w końcu zwykłe dodawanie stringów, ale jednak zatrzymało mnie na dość długo.. Dlatego prosiłbym o zerknięcie na kod:


var
  user  : string;
  dl : dword;
  a,b:string;

begin

  dl := 254;          //nazwa usera -> user
  SetLength(user, dl);
  GetUserName(PChar(user),dl);
  SetLength(user, dl);

  a:='C:\Users\'+user+'\AppData\';  //łączenie ścieszki
  a:=a+b;

 showMessage(a);

end;

program wyświetli jedynie ":\Users[nazwa usera]". Pytanie, dlaczego mi tak ucina, że nie jestem w stanie dodać czegokolwiek po zmiennej 'user' (w której zapisana jest nazwa aktualnego urzytkownika)? Niezależnie od wartości zmiennej b, efekt jest taki sam. Co mogę z tym zrobić?

Pozdrawiam
Kszk

1

Jak ci coś nie działa to zaczynaj czytać dokumentacje na temat wykorzystanych funkcji:
http://msdn.microsoft.com/en-[...]op/ms724432%28v=vs.85%29.aspx
... including the terminating null character. ...

SetLength(user,dl-1);

2

Dlaczaego nie użyjesz zmiennej środowiskowej %APPDATA% albo %LOCALAPPDATA%, albo funkcji WinAPI SHGetFolderPath z parametrem CSIDL_APPDATA?

Takie sklejanie stringa 'c:\users\'+cośtam jest po prostu nieprawidłowe: na XP nie ma "Users" tylko "Documents and Settings", Windows wcale nie musi być na C:, ani nie przewidzisz jak foldery będą się nazywały w przyszłych wersjach systemu.

0

... including the terminating null character. ...

SetLength(user,dl-1);

pomogło, głupi błąd..

Takie sklejanie stringa 'c:\users\'+cośtam jest po prostu nieprawidłowe: na XP nie ma "Users" tylko "Documents and Settings", Windows wcale nie musi być na C:, ani nie przewidzisz jak foldery będą się nazywały w przyszłych wersjach systemu

o tym nie pomyślałem. użycie appdate uprościło sprawę :)

ale teraz pytanie jak pójść dalej, czyli jak znaleźć plik i wydobyć ścieżkę do niego? Boduch pisał o funkcji findfirst, ale z tego co czytałem, ta funkcja nie zwraca ścieżki do danego pliku.

0

czytałem już to i z tego co zrozumiałem informacje nt znalezionego pliku to rozmiar, nazwa, atrybuty etc, ale nie ma ścieżki dostępu.

  • na podanym przykładzie:
    " Na podstawie zdobytej wiedzy można napisać prostą procedurę odnajdującą pliki w danym katalogu:"
    wywnioskowałem, że ta funkcja szuka tylko w danym katalogu, nie zagłębiając się w podkatalogi, tak?

czyli jedyna opcja to spróbować jakoś rekurencyjnie to zrobić, żeby zapamiętywał bieżącą ścieżkę, gdzie szuka. gdy znajdzie, skończy szukanie, a ostatnia zapisana ścieżka jest w moim wypadku ścieżką, którą szukam. dobrze rozumuje?

0

(...) wywnioskowałem, że ta funkcja szuka tylko w danym katalogu, nie zagłębiając się w podkatalogi, tak?

FindFirst działa w obrębie jednego katalogu, tak.

czyli jedyna opcja to spróbować jakoś rekurencyjnie to zrobić, żeby zapamiętywał bieżącą ścieżkę, gdzie szuka. gdy znajdzie, skończy szukanie, a ostatnia zapisana ścieżka jest w moim wypadku ścieżką, którą szukam. dobrze rozumuje?

Coś w tym guście (pisane z palca):

Var FoundFileList: TStringList;

Procedure SearchDir(const FileName, CurrentDir: String);
Var M: TSearchRec;
Begin
 CurrentDir := AddTrailingBackslash(CurrentDir);

 if (FindFirst(CurrentDir+'*.*', faAnyFile or faDirectory, M) = 0) Then
  Exit;

 Repeat
  if ((M.Attr and faDirectory) <> faDirectory) Then
   SearchDir(CurrentDir+M.Name) Else

  if (M.Name = FileName) Then
   FoundFileList.Add(CurrentDir+M.Name);
 Until (FindNext(M) <> 0);

 FindClose(M);
End;

initialization
 FoundFileList := TStringList.Create;

Wywołanie np.: SearchDir('myfile.txt', 'C:');

0

nie rozumiem dokładnie działania procedury. dokładniej 2 fragmenty:

if (FindFirst(CurrentDir+'*.*', faAnyFile or faDirectory, M) = 0) Then 

czy Directory nie zawiera się w AnyFile? wiec nie wystarczyłoby samo faAnyFile?

FoundFileList.Add(CurrentDir+M.Name); 

tutaj zapisujemy gotową ścieżkę do tej listy stringów. nie spotkałem sie nigdy z taką konstrukcją. to coś w stylu stosu? Nie mogę znaleźć nigdzie jak się za to zabrać, żeby odczytać dane z tej listy

0

Nie mogę znaleźć nigdzie jak się za to zabrać, żeby odczytać dane z tej listy

delphi TStringList nic nie zwraca?

FoundFileList.Count to ilość elementów na tej liście, a aby odczytać któryś z nich należy skorzystać z FoundFileList[ID] lub FoundFileList.Strings[ID] (iterowane od zera).
Np.:

For I := 0 To FoundFileList.Count-1 Do
 Writeln(FoundFileList[I]);

lub

Var Str: String;
{...}
For Str in FoundFileList Do
 ...
0

myślałem, że dalej sam sobie poradzę, ale jednak nie.. nie działa rekurencja, tzn znajduje mi plik tylko w katalogu głównym. Jeżeli go usunąć to nic nie znajduje

zmodyfikowałem trochę kod:


Procedure SearchDir(const FileName: string; CurrentDir: String);
Var M: TSearchRec;
Begin
  if CurrentDir[length(CurrentDir)] <> '\' then CurrentDir := CurrentDir + '\';

 if (FindFirst(CurrentDir+'*.*', faAnyFile or faDirectory, M) <> 0) Then
  Exit;

 Repeat

  if ((M.Attr and faDirectory) <> faDirectory) Then
   SearchDir(filename, CurrentDir+M.Name) Else;
  if (M.Name = FileName) Then begin
   FoundFileList.Add(CurrentDir+M.Name);
   end;
 Until (FindNext(M) <> 0);

 FindClose(M);
End;

wywołuje poprzez:

SearchDir('do.txt', 'C:'); 

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