[#1] AMOS Dir First$ / Dir Next$ Problem z odczytem pełnej nazwy katalogu.
Piszę tutaj bo u "prywaciarzy" posucha, aż oczy szczypią :)

Ktoś mógłby rzucić pomysłem dlaczego komendy >Dir First$ / Dir Next$< zaczytuje tylko 29 zamiast 30 znaków z nazwy katalogu?

Domyślam się, że AMOS dodaje "*" jeśli rozpozna przy odczycie czy ma do czynienia z katalogiem lub plikiem.

Przykładowo wygląda to mniej więcej tak:
Nazwy:

ORYG: 012345678901234567890123456789 <DIR> (30 znaków)
AMOS: *01234567890123456789012345678 <DIR> (po odjęciu gwiazdki 29)

Takie coś AMOS zgłasza jako "file not found."

Generalnie jest to jakoś do obejścia, bo sprawdziłem czy DiskManager z Accessories się wywali i o dziwo otwiera takie katalogi. W kodzie źródłowym nie wiele wynika, odczyt plików i katalogów jest podobny do tego który napisałem samemu.
[#2] Re: AMOS Dir First$ / Dir Next$ Problem z odczytem pełnej nazwy katalogu.

@groovebox, post #1

Na moje oko Amos odczytuje wszystkie znaki, tylko string katalogu ma tą gwiazdkę, zaś string pliku ma dodany ciąg długości. Więc używając jakiejś komendy load musisz stworzyć nowy ciąg bez tej gwiazdki i bez długości, dokładnie jak w disk managerze.
[#3] Re: AMOS Dir First$ / Dir Next$ Problem z odczytem pełnej nazwy katalogu.

@cholok, post #2

zapytaj asmana, to skarbnica wiedzy:)
[#4] Re: AMOS Dir First$ / Dir Next$ Problem z odczytem pełnej nazwy katalogu.

@groovebox, post #1

Amos to dziwne stworzenie. Ja bym jednak zamiast tych Dir First$ i DirNext$ użył biblioteki dos.library i Lock, Examine, ExNext, Unlock. Z tej prostej przyczyny, że jeśli Amos zczytuje tylko 29 i 30 znaków, to jest zdecydowanie do bani, bo trzeba wziąc pod uwagę, że część użytkowników może mieć inny system plików niż OFS/FFS i wtedy to dopiero będzie kiełbasa z czarnego świniaka.
W strukturze FileInfoBlock (jej używasz właśnie w Examine, ExNext) jest pole fib_FileName[108] mogące pomieścić 107 znaków - mimo że OFS/FFS wspiera tylko 30. I ja bym się tego trzymał.

Ostatnia aktualizacja: 26.05.2016 23:23:01 przez asman
[#5] Re: AMOS Dir First$ / Dir Next$ Problem z odczytem pełnej nazwy katalogu.

@asman, post #4

to się już ociera o assemblera, nigdy nie potrafiłem wykorzystywać bibliotek z poziomu AMOSa, nawet przy użyciu literatury jest to dla mnie niejasne. Dam sobie spokój bo efektem końcowym będzie i tak czerwone GURU.
[#6] Re: AMOS Dir First$ / Dir Next$ Problem z odczytem pełnej nazwy katalogu.

@asman, post #4

Przecież napisałem, że odczytuje wszystkie znaki. Tak, sprawdziłem.
[#7] Re: AMOS Dir First$ / Dir Next$ Problem z odczytem pełnej nazwy katalogu.

@cholok, post #6

Ja sprawdzałem pod WinUAE i utworzyłem katalog o długości 35 znaków, i jak zrobiłem print Dir First$ to otrzymałem gwiazdkę i 29 znaków. I to mnie popchnęło do tego, żeby zrezygnować z Dir First$.
[#8] Re: AMOS Dir First$ / Dir Next$ Problem z odczytem pełnej nazwy katalogu.

@asman, post #7

Już chciałem na kolanach błagać o wybaczenie..., ale jest taka komenda set dir, która ustawia maksymalną liczbę znaków. Nie wiem czy obsługuje coś więcej niż OFS/FFS, ale te 30 odczytuje dobrze. Można też spróbować craft extension, posiada alternatywne komendy odczytu katalogów. Używanie funkcji systemowych z poziomu Amosa to jednak hardcore.
[#9] Re: AMOS Dir First$ / Dir Next$ Problem z odczytem pełnej nazwy katalogu.

@cholok, post #8

Za pomocą Set Dir ustawiłem maksymalnie 105 (dla 106 i 107 otrzymałem błąd illegal function call ) I teraz Dir First$ daje radę, czyli jest gwiazdka a potem 35 znaków dla katalogu 35 znakowego. W każdym razie po raz kolejny świat został uratowany od hardcoru - bo już zacząłem w amosie klepać jak by to wyglądało za pomocą funkcji systemowych. Chylę czoła.
[#10] Re: AMOS Dir First$ / Dir Next$ Problem z odczytem pełnej nazwy katalogu.

@asman, post #9

Panowie jesteście wielcy. Nie taki głupi AMOS jak malują. SetDir ogarnął problem. Dzięki Wielkie!

Swoją drogą z chęcią bym zobaczył jak wygląda kod zamiennika zbudowanego na dos.library. ślina
[#11] Re: AMOS Dir First$ / Dir Next$ Problem z odczytem pełnej nazwy katalogu.

@groovebox, post #10

To wymaga troche większej znajomośc, szczególnie że trzeba wiedzieć ile zajmuje struktura FileInfoBlock, trzeba znać przesuniecia w tej strukturze by dobrać się do tego co chcesz.
'zaalokowanie pamieci dla struktury FileInfoBlock  
'
' d0 = rozmiar struktury FileInfoBlock ktora wynosi 260 bajtow 
' d1 = type pamieci w tym przypadku dowolna (MEMF_PUBLIC)
'
' AllocMem ma przesuniecie -198 (exec.library)   
'
' zwraca adres niezerowy jesli udalo sie zaalokowac  
' zero jak sie nie udalo, ja z lenistwa nie sprawdzam tego 
' a powinienem 
'
Dreg(0)=260
Dreg(1)=1
_FILE_INFO_BLOCK=Execall(-198)

'robimy lock na katalogu 
'
' d1 - adres stringa zakonczonego zerem
'      (tu mam nadzieje ze amos konczy zerem zmienna A$) 
'
' d2 - tryb dostepu, w tym przypadku wystarczy ACCESS_READ czyli -1
'
' Lock ma przesuniece -84 (dos.library)
'
' zwraca zero jesli sie nie udalo (na przyklad nie istnieje plik/katalog 
' a jak sie udalo to zwraca wartosc niezerowa ktora pozniej uzywamy  
'

A$="work:srcAmos/a"
Dreg(1)=Varptr(A$)
Dreg(2)=-2
_LOCK=Doscall(-84)

If _LOCK<>0

   ' robimy examine na locku
   '
   ' d1 - lock, ktory otrzymalismy od Lock
   ' d2 - adres file info block 
   '  
   ' Examine ma przesuniecie -102 (dos.library) 
   '
   Dreg(1)=_LOCK
   Dreg(2)=_FILE_INFO_BLOCK
   _RESULT=Doscall(-102)
   Print "examine:";
   Print _RESULT
   If _RESULT<>0

      ' tu na przyklad sprawdzamy z kim mamy do czynienia, jesli jest -1 
      ' to jest to katalog, w przeciwnym razie plik
      Print "dir entry";
      Print Leek(_FILE_INFO_BLOCK+4);
      Print 

      ' robimy ExNext na Examine by dowiedziec sie co jeszcze mamy w 
      ' w katalogu 
      '
      ' d1 - lock
      ' d2 - ten sam file info block co w examine
      '
      ' ExNext ma przesuniecie -108 (dos.library)
      '
      ' zwraca zero jesli blad, trzeba uzyc IoErr by poznac szczegoly
      ' bledu
      Dreg(1)=_LOCK
      Dreg(2)=_FILE_INFO_BLOCK
      _R2=Doscall(-108)
      Print "exnext:";
      Print _R2

      'to trzeba sprawdzac jesli _R2 bylo zerem
      'jesli w katalogu nie ma innych podkatalogow i plikow to zwraca
      'AmigaDOS errorcode 232 - no more entries in directory 
      _IOERR=Doscall(-132)
      Print _IOERR

      ' czytamy z pola fib_FileName nazwe
      '
      '
      _FIB_NAME=_FILE_INFO_BLOCK+8
      For I=0 To 106
         A=Peek(_FIB_NAME+I)
         Exit If A=0
         Print Chr$(A);
      Next I
      Print 
   End If 

   ' robimy unlock
   ' d1 - lock
   ' Unlock ma przesuniece -90
   ' nic nie zwraca, stad zdupna zmienna _VOID
   Dreg(1)=_LOCK
   _VOID=Doscall(-90)
End If 


'zwolnienie pamieci struktur FileInfoBlock 
'
' A1 - adres, ktory zworcil AllocMem 
' D0 - ilosc bajtow ktore rezerwowalismy 
'
' FreeMem ma przesuniece -210
' nie zwraca nic 
'
Areg(1)=_FILE_INFO_BLOCK
Dreg(0)=260
_VOID_=Execall(-210)


Ten prosty przykładzik sprawdza w katalogu pierwsze coś, które w nim jest (plik bądź katalog) i wyświetla nazwę na ekranie + pare innych debugowych informacji .
O ile bieganie w jednym katalogu i sprawdzanie co tam jeszcze jest, nie wymaga osobnej struktury FileInfoBlock, to jeśli chcesz włazić w podkatalogi i sprawdzać głębiej to nie powinieneś używać tej same FileInfoBlock - przynajmniej tak piszą w dokach.

Standardowo jak pytania to śmiało.

Edit: Jeszcze jedna sprawa, trzeba by dodać sprawdzanie czy udalo sie zaalokowac pamieć na file info block, bo gdyby sie nie udało to podejrzewam że wszystko przępięknie będzie wisieć, jak rzekł impotent optymista.


Ostatnia aktualizacja: 27.05.2016 16:42:06 przez asman
[#12] Re: AMOS Dir First$ / Dir Next$ Problem z odczytem pełnej nazwy katalogu.

@asman, post #11

Można nieco uczytelnić przykład. W katalogu APSystem tworzymy nowy katalog o nazwie Equates. Kopiujemy tam plik AMOSPro_System_Equates z katalogu Productivity1/Equates.

Teraz AMOS rozumie nazwy z inkludów
a=Doscall(Lvo("Lock"))
a=Doscall(Equ("_LVOLock")
Jest też komenda do struktur.
W Productivity1 jest edytor do własnych stałych oraz pewne info, które polecam poczytać, jako, że help jest w tym temacie przestarzały.

Zaś do alokacji pamięci można użyć Reserve as work/data.
[#13] Re: AMOS Dir First$ / Dir Next$ Problem z odczytem pełnej nazwy katalogu.

@cholok, post #12

Dzięki wielkie! Obadam sprawę.
[#14] Re: AMOS Dir First$ / Dir Next$ Problem z odczytem pełnej nazwy katalogu.

@asman, post #13

Ja też :) Panowie, ten temat widzę jest jak najbardziej rozwojowy. Dzięki Asman za exampla obadam jak tylko dorwę się do swojej maszyny. Pozdro dobrzy ludzie.
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem