Seite 2 von 2

Verfasst: 28.09.2008 17:31
von Falko
Das Problem ist halt, das du mittels Commandshell vom Benutzerverzeichnis
dein Programm mit Parameter aufrufst. Damit ist also nicht das Verzeichnis,
dass mit GetCurrentDirectory() ausgegeben wird, das Programmverzeichnis,
sondern das aktuelle wovon du dein DOS-Befehl startest. Darum wird es dort
auch hin kopiert.

Wenn also vorher bekannt ist, wo deine Exe sich befindet, könntest du es
zuvor mit SetCurrentDirectory setzen.

Andernfalls könnte man den Pfad auch in einen weiteren Parameter mit
angeben, der dann in Openfile eingebracht wird.

Gruß
Falko

Verfasst: 28.09.2008 18:04
von ts-soft
Ich hab das Problem wohl noch nicht so ganz verstanden, scheint aber das
typische GetCurrentDirectory() problem zu sein :wink:
GetCurrentDirectory gibt das aktuelle Verzeichnis zurück, welches sonstwo
hinzeigen kann, wenn es nicht gesetzt wurde! (z.B. Verknüpfung: Ausführen in fehlt, oder shell usw.)
Hier mal Pseudocode:

Code: Alles auswählen

; entweder dort speichern, wo die gedroppte datei ist:
Path.s = GetPathPart(name)
; oder im programmverzeichnis, was meist nicht erlaubt ist! aber hier nur als beispiel:
Path.s = GetPathPart(ProgramFilename())

; danach den Pfad fürs Programm setzen
SetCurrentDirectory(Path)
wobei ich vermute, das die zweite Variante gewollt ist. Diese ist aber nicht
sonderlich sinnvoll, weil dafür müßte das Tools mit Adminrechten laufen,
was unter XP für die meisten zwar standard ist, aber unter Vista meist nicht.

Verfasst: 28.09.2008 20:07
von Fabio
@ts-soft, genau so ist es, wie in Punkt 2 beschrieben.

Also müsste ich z.b. in einer *.ini den momentanen Path der exe speicher und von dort auslesen damit die datei auch dort gespeichert wird.
)

Dann ist es etwas blöde :( das soll so nicht sein.

Das besser wäre also hier ein FileRequest einzubauen wo ich
eine zu überprüfende Datei selber angebe, da das anscheinend nur passiert
wenn ich mir den path mit ProgramParameter() angeben lasse.

Gut, dann werd ich mal wieder etwas in der hilfe wühlen :)

Verfasst: 28.09.2008 20:14
von Falko
Filerequester ist auch nicht schlecht. Dann nimmst du Runprogramm und führst die Datei mit dem Wunschparameter aus.

Da du weißt, wie du den Pfad mit Datei angibst könntest du das gleiche beim Parameter machen. Beispiel habe ich mal kurz zusammengestellt.

Der Aufruf in der CMD ist im Sourcetext vorgegeben, den du kopieren und einfügen kannst.

Code: Alles auswählen

;Parameter bzw. Path der Datei wird als String der Globalen Variable
;name.s übergeben
name.s = ProgramParameter()

;Bitte bei der Shell Eingabe des Parameters den kompletten Path mit Datei angeben

;Beispiel: E:\Basic\Projekte\Purebasic\md5\Test.exe E:\Basic\Projekte\Purebasic\md5\MyPara.txt


path.s=GetPathPart(name)


MessageRequester("Ausgabe",path) 
;Konsole wird geöffnet damit ich eine visuelle anzeige habe ;)
OpenConsole()

;Titel/Name
ConsoleTitle("go_MD5  (c) Fabbio - D2O - Soddu")

;Gelbe schrift auf roten hintergrund
ConsoleColor(14,4)



;Globale Variable für die ausgabe von MD5FileFingerprint(name.s)
out.s

;Hier habe ich die variable debugt und bekomme den richten path angezeigt
Debug name



; Datei sollte erstellt werden, geht aber nicht :(
OpenFile(0,path+"MD5_Output_OneFile.txt")
      WriteString(0,"Dateiname")
      WriteString(0," ; ")
      WriteStringN(0,"MD5")

PrintN("www.deuteriumoxid.com")


 
  PrintN("Working, please wait")              ; Consolen ausgabe, nur zu testzwecken
 
     
   
   
     
       out = MD5FileFingerprint(name)
     
   
     
      WriteString(0,name) ; Name der Datei
      WriteString(0," ; ")  ;Semikolon schreiben
      WriteStringN(0,out) ;MD5 wert schreiben
   

 


CloseFile(0)  ;Datei schliesen
CloseConsole();Console schliesen 
Die Ausgabe sieht dann so aus:
Dateiname ; MD5
E:\Basic\Projekte\Purebasic\md5\MyPara.txt ; ceb25a90e02cb1e41ee0a52f2465c175
Gruß
Falko

Verfasst: 28.09.2008 21:52
von Fabio
Juhu geschaft :allright:
Das mit den Requestern gefällt mir sehr gut.
So habe ich nun beide Versionen damit ausgestattet,
die, wo man nur eine Datei wählen kann und eine zeite
wo man einen ganzen Ordner auswählt.

Einige sachen sind mir noch nicht ganz schlüssig, aus der hilfe/forum Kopiert
und nur für mich angepasst, aber auch nicht ganz blind kopiert und mir die Infos dazu auch angeschaut (noch nicht alles verstanden,
aber angeschaut ;) )

Hier nochmals Danke für Eure Mühe und Hilfe :allright:

Anbei noch beide Lösungen von mir:

Code: Alles auswählen

 
 StandardFile$ = GetCurrentDirectory()
 Global name.s =  OpenFileRequester("Datei Öffnen",StandardFile$,"Alle Dateien (*.*)|*.*",0)       


;Konsole wird geöffnet damit ich eine visuelle anzeige habe ;)
OpenConsole()




;Titel/Name
ConsoleTitle("go_MD5  (c) Fabbio - D2O - Soddu")

;Gelbe schrift auf roten hintergrund
ConsoleColor(14,4)



;Globale Variable für die ausgabe von MD5FileFingerprint(name.s)
Global out.s

;Aktueller Path übergeben
Global path.s = GetCurrentDirectory()

PrintN(path+"MD5_Output_OneFile.txt")

;Createfile, da sicher gestellt sein soll das die datei neu ohne inhalt ist
CreateFile(0,path+"MD5_Output_OneFile.txt")

;Erste Zeile schreiben

    WriteString(0,"Dateiname")
    WriteString(0," ; ")
    WriteStringN(0,"MD5")

;Consolen ausgabe
PrintN("www.deuteriumoxid.com")
PrintN("Danke an die Deutsche PureBasic Comunity")
PrintN("http://www.purebasic.fr/german/index.php")

PrintN("Working, please wait")              
 
     
   
   
     ;MD5 wert übergeben
       out = MD5FileFingerprint(name)
     
      ;Kompletter Datei path auf den Dateinamen kürzen
      name = GetFilePart(name) 
      
      
      WriteString(0,name) ; Name der Datei
      WriteString(0," ; ")  ;Semikolon schreiben
      WriteStringN(0,out) ;MD5 wert schreiben
   

 


CloseFile(0)  ;Datei schliesen
CloseConsole();Console schliesen 


Code: Alles auswählen



 StandardFile$ = GetCurrentDirectory()
 Global path.s = PathRequester("Ordner Öffnen", StandardFile$)


OpenConsole()

;Titel/Name
ConsoleTitle("go_MD5  (c) Fabbio - D2O - Soddu")

;Gelbe schrift auf roten hintergrund
ConsoleColor(14,4)




Global out.s



ExamineDirectory(0,  path, "*.*") ; Ordner darüber öffnen

CreateFile(0,"MD5_Output_AllFile.txt")

      WriteString(0,"Dateiname")
      WriteString(0," ; ")
      WriteStringN(0,"MD5")

PrintN("www.deuteriumoxid.com")
While NextDirectoryEntry(0) ; solange was im Ordner vorhanden ist

  
  PrintN("Working, please wait")              ; Consolen ausgabe, nur zu testzwecken
  If DirectoryEntryType(0) = #PB_DirectoryEntry_File         
      
    name.s = DirectoryEntryName(0)   ; Name der vorhandenen Datei
    
      ;out.s = MD5FileFingerprint(path + "\" + name.s) 
       out.s = MD5FileFingerprint(name.s) 
      
     ;out.s =  MD5FileFingerprint(name.s)  ;MD5 von der Datei erstellen<<< bekomme aber hier keine ausgabe
      Debug out.s
      WriteString(0,name.s)
      WriteString(0," ; ")
      WriteStringN(0,out.s)
   
     
    EndIf
 

Wend 

CloseFile(0) 
CloseConsole()


Verfasst: 28.09.2008 22:05
von ts-soft
Fabio hat geschrieben:Juhu geschaft :allright:
o_O

Hab jetzt nur den 2ten snippet getestet:
1. öffnet System32 bei mir :freak:
2. abbrechen im Pathrequester wird ignoriert, er würde also bei mir in
system32 eine Datei erstellen, wenn er die Rechte hätte, hat er bei mir nicht :mrgreen:

Grob geänderter Code:

Code: Alles auswählen

StandardFile$ = GetPathPart(ProgramFilename())
Global path.s = PathRequester("Ordner Öffnen", StandardFile$)
If path
  OpenConsole()
  ;Titel/Name
  ConsoleTitle("go_MD5  (c) Fabbio - D2O - Soddu")
  ;Gelbe schrift auf roten hintergrund
  ConsoleColor(14,4)
  Global out.s
  ExamineDirectory(0,  path, "*.*") ; Ordner darüber öffnen
  CreateFile(0,"MD5_Output_AllFile.txt")
  WriteString(0,"Dateiname")
  WriteString(0," ; ")
  WriteStringN(0,"MD5")
  PrintN("www.deuteriumoxid.com")
  While NextDirectoryEntry(0) ; solange was im Ordner vorhanden ist
    PrintN("Working, please wait")              ; Consolen ausgabe, nur zu testzwecken
    If DirectoryEntryType(0) = #PB_DirectoryEntry_File
      name.s = DirectoryEntryName(0)   ; Name der vorhandenen Datei
      ;out.s = MD5FileFingerprint(path + "" + name.s)
      out.s = MD5FileFingerprint(name.s)
      ;out.s =  MD5FileFingerprint(name.s)  ;MD5 von der Datei erstellen<<< bekomme aber hier keine ausgabe
      Debug out.s
      WriteString(0,name.s)
      WriteString(0," ; ")
      WriteStringN(0,out.s)
    EndIf
  Wend
  CloseFile(0)
  CloseConsole()
EndIf
Hab die Leerzeilen entfernt, um Boardplatz zu sparen :mrgreen:
Nehme als Ausgangspfad, den der eigenen exe, in der IDE wird das
wahrscheinlich Temp sein.
Das If ist wichtig nach dem Requester, ob ich überhaupt etwas gewählt habe!

Verfasst: 29.09.2008 09:24
von Fabio
Moin moin,
Danke.

Nur ist mir jetzt was aufgefallen, das mit dem Ordner auswählen
funktioniert ansich ja.
Aber nur wenn ich den Ordner auswähle in dem die exe selber drin ist werde alle Dateien korrekt erkannt und ein MD5 wert erstellt und abgespeichert.
Nehme ich den Ordner über der Exe, werden die Dateinamen auch erkannt und abgespeichert aber kein MD5 wert, ausser es handelt sich um eine exe Datei :?
Das schaft mich wieder Total :coderselixir:
Aber bitte beachten das von der "MD5_Output_AllFile.txt" kein MD5
wert erstellt werden kann, die Datei ist ja noch nicht abgeschlossen.

Hier mal die ausgaben.
Gleicher Ordner
Dateiname ; MD5
Einführung in PureBasic_020508.pdf ; 066a75bf7fbc6ca8622546dc2b9585d1
go_md5_AllFile.exe ; c6b47f590c0e037d174102b0cab6c022
go_md5_OneFile.exe ; d83359b14f32f95fc32cf6de74ca0d27
go_md5_StillAllFile.exe ; adf8812e46256c76906235bac223a3c7
MD5_Output_AllFile.txt ;
MD5_Output_OneFile.txt ; 5d67c1196152c06f9114e58e5b8edaea
MD5_Output_stillAllFile.txt ; ab64f1e9e203d15978e49c1a0b476a56
Ordner darüber
Dateiname ; MD5
Einführung in PureBasic_020508.pdf ;
go_md5_AllFile.pb ;
go_md5_AllFile.v.0.2.pb ;
go_md5_AllFile.v.0.3.pb ;
go_md5_OneFile .v0.2.pb ;
go_md5_OneFile.pb ;
go_md5_StillAllFile.exe ; adf8812e46256c76906235bac223a3c7
go_md5_StillAllFile.pb ;
Make_MD5.pb ;
Make_MD5_v2.pb ;
Make_MD5_v3.pb ;
Make_MD5_v4.pb ;
Make_MD5_v5.pb ;

Edit://
Ich hab den fehler gefunden.
Anstatt
out.s = MD5FileFingerprint(name.s)
muss es
out.s = MD5FileFingerprint(path + "\" + name.s)
heisen.

Hier noch der gesammte code.

Code: Alles auswählen

StandardFile$ = GetPathPart(ProgramFilename())

Global path.s = PathRequester("Ordner Öffnen", StandardFile$)
If path
  OpenConsole()
  ;Titel/Name
  ConsoleTitle("go_MD5  (c) Fabbio - D2O - Soddu")
  ;Gelbe schrift auf roten hintergrund
  ConsoleColor(14,4)
  Global out.s
  ExamineDirectory(0,  path, "*.*") ; Ordner öffnen
  CreateFile(0,"MD5_Output_AllFile.txt")
  WriteString(0,"Dateiname")
  WriteString(0," ; ")
  WriteStringN(0,"MD5")
  PrintN("www.deuteriumoxid.com")
  While NextDirectoryEntry(0) ; solange was im Ordner vorhanden ist
    PrintN("Working, please wait")              ; Consolen ausgabe, nur zu testzwecken
   If  DirectoryEntryType(0) = #PB_DirectoryEntry_File
      name.s = DirectoryEntryName(0)   ; Name der vorhandenen Datei
      out.s = MD5FileFingerprint(path + "\" + name.s) ;:<<<<<<<<<<<<so muss es sein
      ;out.s = MD5FileFingerprint(name.s)   ;<<<<<<<<<<<<<<<<<<<<<<<nicht so
      WriteString(0,name.s)
      WriteString(0," ; ")
      WriteStringN(0,out.s)
    EndIf
  Wend
  CloseFile(0)
  CloseConsole()
  
  FinishDirectory(0)
EndIf