Witam. Pisze serwerek w BDS_2006 korzystając z Indy 9. Jedna zmienna a raczej stała przyjmuje złe wartości.
Chodzi o stałą APath która to przy każdym wchodzeniu w katalog powinna zawierać <ort>scierzkę </ort>do tego katalogu. Jak się okazuje
to ta zmienna zawiera tą <ort>scierzkę </ort>do danego katalogu ale też zawiera wszystkie poprzednie <ort>scierzki</ort>.
wygląda to mniej więcej tak:
najstarszy_pathstary_pathmłody_path//aktualny_path
I tak w APath występuje kilka razy ten sam folder.
Tak więc path wydłuża się z każdym przejściem do innego katalogu nawet jeśli przemieszczam się wstecz. Po kilku przechodzeniach po katalogach gdy wracam do katalogu roota to APath jest już bardzo długi.
W delphi7 z indy 9 jest identycznie ale już indy10 <ort>NIE MA </ort>tego problemu.
Czy można jakoś zerować tą zmienną.
//---------------------------------------------------------------------------
void __fastcall TForm1::IdFTPServer1ListDirectory(TIdFTPServerThread *ASender,
const AnsiString APath, TIdFTPListItems *ADirectoryListing)
{
TIdFTPListItem *LFTPItem;
TSearchRec SR;
int SRI;
String LTmpPath;
AnsiString pom_APath = APath;
pom_APath = ZamianaZnakow(APath); zamieniam te ukosniki
Memo1->Lines->Add(pom_APath); //tutaj patrzę na zawartość
pom_APath = obcinaj(pom_APath); //tutaj wywalam ten path poprzedni - zostawiam poprawny
Memo2->Lines->Add(pom_APath); //tutaj widzę że path jest już poprawny
LTmpPath = ZamianaZnakow(AppDir + ASender->HomeDir + pom_APath);
if (DirectoryExists(LTmpPath))
LTmpPath = LTmpPath + "\\*.*";
else
LTmpPath = LTmpPath + "*.*";
SRI = FindFirst(LTmpPath,faAnyFile,SR);
while( SRI==0 )
{
LFTPItem = ADirectoryListing->Add();
LFTPItem->FileName = SR.Name;
if (SR.Attr && faDirectory)
{
LFTPItem->ItemType = ditDirectory;
}
SRI = FindNext(SR);
}
FindClose(SR);
}
//---------------------------------------------------------------------------
a tu obcinam złą zawartość:
//---------------------------------------------------------------------------
String TForm1::obcinaj(String path)
{
char *ch = path.c_str();
int len = path.Length();
int index = 0;
for(int i = len; i>=0; i--)
{ //jak znajdę podwójny ukosnik to znak że zaczyna się stary path
if (ch[i]=='\' && ch[i-1]=='\')
{
index = i;
break;
}
}
path = path.Delete(1,index); // ucinam zbędne rzeczy
return path;
}
Wiem że to C++ jednak w delphi kod wygląda niemal że identycznie, a <ort>poza tym </ort>w Builderze6 są jeszcze większe problemy
z indy9