Seite 1 von 1

RunProgram - Sicherheitsabfrage of File existiert

Verfasst: 17.05.2006 09:14
von Ironsmurf
Hallo zusammen
Ich möchte gerne mein Programm spitten in einzelne Dateien um es übersichtlicher zugestalten, dazu gehört auch das starten anderer Programme.
Da ich blutiger Anfänger bin, habe ich das mit dem RunProgram-Befehl hinbekommen, aber wie muß der Quelltext geschrieben sein, damit KEINE Fehlermeldung auftaucht, wenn die Datei NICHT existiert ?

Vielen Dank für eure Hilfe im voraus

Code: Alles auswählen

;Play the Movies
If RunProgram("D:\Anwendungen\MAX Butler\Start - Movies\"+Eingabe$+"")
PrintN("")
ConsoleColor(12,0)
PrintN("Es wird ca. 10 Sekunden bis zum Filmstart dauern.")
endif

PS:Die 10 Sekunden werden benötigt um durch die externe Datei, das serielle Relais zuschalten und die USB-Platte zu initialisieren, bevor der Film gestartet werden kann
EndIf

Verfasst: 17.05.2006 09:24
von ts-soft

Code: Alles auswählen

Procedure FileExists(szFileName.s)
  Protected Result.l, Find.WIN32_FIND_DATA
  Result = FindFirstFile_(@szFileName,Find)
  FindClose_(Result)
  If Result <> #INVALID_HANDLE_VALUE
    ProcedureReturn #True
  EndIf
  ProcedureReturn #False
EndProcedure

;Play the Movies
MyProgram.s = "D:\Anwendungen\MAX Butler\Start - Movies\" + Eingabe$

If FileExists(MyProgram) And RunProgram(MyProgram)
  PrintN("")
  ConsoleColor(12,0)
  PrintN("Es wird ca. 10 Sekunden bis zum Filmstart dauern.")
Else
  PrintN("")
  ConsoleColor(12,0)
  PrintN("Den Film finde ich nicht ;(")
EndIf
Wenn Du allerdings auch Linux oder MacOS verwenden möchtest, solltest Du die Existenz lieber mit FileSize checken.

Re: RunProgram - Sicherheitsabfrage of File existiert

Verfasst: 17.05.2006 13:36
von Joel
Ironsmurf hat geschrieben:Da ich blutiger Anfänger bin,
Nachmacher, http://www.purebasic.fr/german/viewtopi ... 1547#91547
aber gut dass meine ausdrückre durch die welt gehen. :lol: :mrgreen:

Re: RunProgram - Sicherheitsabfrage of File existiert

Verfasst: 17.05.2006 13:39
von Kaeru Gaman
Joel hat geschrieben:meine ausdrücke
...wir haben schon "blutiger Anfänger" gesagt, da warst du noch flüssig.

Verfasst: 17.05.2006 14:45
von HeX0R
Was ist denn der Vorteil der Api-Version gegenüber FileSize() ?

Verfasst: 17.05.2006 14:52
von ts-soft
HeX0R hat geschrieben:Was ist denn der Vorteil der Api-Version gegenüber FileSize() ?
FileSize öffnet die Datei, was unnötig ist und länger dauert.

Verfasst: 17.05.2006 15:34
von HeX0R
Also ich bekomme folgende Ausgabe mit dem nachfolgenden Code:

---------------------------
Info
---------------------------
Files Scanned: 34307
Api Found-Files:34307
Api-Version: 5.88sec.
PB Found-Files:34307
PB-Version: 5.86sec.
---------------------------
OK
---------------------------

Hier der kleine Testcode:

Code: Alles auswählen

Procedure FileExists(szFileName.s)
  Protected Result.l, Find.WIN32_FIND_DATA
  Result = FindFirstFile_(@szFileName,Find)
  FindClose_(Result)
  If Result <> #INVALID_HANDLE_VALUE
    ProcedureReturn #True
  EndIf
  ProcedureReturn #False
EndProcedure

Global NewList FileOrNoFile.s()

Procedure.l SearchAll(Path.s)

	Count.l = 0
	Dir.l   = ExamineDirectory(#PB_Any, Path, "")
	If Dir
		While NextDirectoryEntry(Dir)
			Select DirectoryEntryType(Dir)
				Case #PB_DirectoryEntry_Directory
					If DirectoryEntryName(Dir) <> "." And DirectoryEntryName(Dir) <> ".."
						Count + SearchAll(Path + DirectoryEntryName(Dir) + "\")
					EndIf
				Case #PB_DirectoryEntry_File
					;correct File
					AddElement(FileOrNoFile())
					FileOrNoFile() = Path + DirectoryEntryName(Dir)
					Count + 1
					;create a random Filename (i guess it won't exist)
					AddElement(FileOrNoFile())
					a$ = ""
					For j = 1 To 5
						a$ + Chr(Random(25) + 65)
					Next j
					FileOrNoFile() = Path + a$ + ".txt"
			EndSelect
		Wend
		FinishDirectory(Dir)
	EndIf
	ProcedureReturn Count
	
EndProcedure

Count = SearchAll("C:\")
S1    = ElapsedMilliseconds()
D1    = 0
ForEach FileOrNoFile()
	If FileExists(FileOrNoFile())
		D1 + 1
	EndIf
Next
S1 = ElapsedMilliseconds() - S1

S2 = ElapsedMilliseconds()
D2 = 0
ForEach FileOrNoFile()
	If FileSize(FileOrNoFile()) > -1
		D2 + 1
	EndIf
Next
S2 = ElapsedMilliseconds() - S2

MessageRequester("Info", "Files Scanned: " + Str(Count) + #LF$ + "Api Found-Files:" + Str(D1) + #LF$ + "Api-Version: " + StrF(S1 / 1000, 2) + "sec." + #LF$ + "PB Found-Files:" + Str(D2) + #LF$ + "PB-Version: " + StrF(S2 / 1000, 2) + "sec.")

Da scheints also nicht wirklich Geschwindigkeitsunterschiede zu geben.
Hätte mich auch gewundert...

Verfasst: 17.05.2006 15:39
von ts-soft
Getested hab ich es nicht, ich nutze es trotzdem lieber, weil ich des öfteren
Probleme hatte, unmittelbar nach FileSize, dieselbe Datei zu öffnen. Oftmals
war einfach noch kein Zugriff möglich. Meine Festplatten laufen alle
Busmastered.
Wer lieber FileSize nutzt, soll dies tun :wink:

Verfasst: 17.05.2006 16:20
von Joel
:lol: :lol: stimmt!
:lol: