11 berichten aan het bekijken - 1 tot 11 (van in totaal 11)
  • Q:
    Bijdrager
    Sumar

    Check of bestand bestaat (Applescript)

    Ik wil in Applescript checken of een bestand bestaat. Daarvoor heb ik deze routine;

    <br />
    			tell application "Finder"<br />
    				set myfile to POSIX file ImageFileNamePath as alias<br />
    				if not (exists file myfile) then<br />
    					display dialog ImageFileNamePath & " bestaat niet"<br />
    					set OutputRegel to OutputRegel & " " & ImageFileNamePath<br />
    				end if<br />
    			end tell<br />
     

    ImageFileNamePath is een POSIX pad.

    Het gaat helemaal goed op een klein ding na: zodra er een regel komt die begint met ~/ dan gaat het mis. Ik heb me al helemaal wild gezocht maar kan ’t niet vinden. (zal wel iets simpels zijn wat ik over het hoofd zie)

    Bijdrager
    iep

    De ~ geeft aan dat het om de userdir van de actieve gebruiker gaat. Als jij ingelogd bent als Pietje met gebruikersnaam pietje en je voert dat script dan uit dan vult hij voor de ~ het volgende in: /Users/pietje. In jouw verhaal wordt ~/ dan: /Users/pietje/ (kijk heeeeeeel erg goed naar de verschillen hier: hoofdletters/kleine letters en wel/geen /). Bedenk of hetgeen je aan het doen bent geldt voor een file in de userdir of daarbuiten.

    Bijdrager
    Verwijder

    in de AppleScript Language Guide staat

    Use of “~” to specify a home directory is not supported.

    je zou ~ zelf af kunnen vangen of iets met do shell script kunnen doen.

    Bijdrager
    Pieterr

    Aanvullend: het ‘dirname’ shellcommand voert tilde-expansie uit. Misschien kun je dat ergens tussen prutsen.

    Bijdrager
    Sumar

    @Willemien: Dank. Wist wel dat het iets kleins was:lol:

    @Pieterr: dirname ~ (of dirname ~/) geeft /Users terug, daar schiet ik weinig mee op. ls werkt wel, maar dan zit je weer met de afhandeling van de string die terugkomt. Ik denk niet dat ik ontkom aan een shell script.

    Bijdrager
    Pieterr

    In pseudocode: fname = dirname fname “/” basename fname

    Als je de tilde wilt expanderen, zou je iets als “dirname ~/Desktop” kunnen gebruiken.

    Bijdrager
    Verwijder

    voorbeeldjes:

    <br />
    if character 1 of ImageFileNamePath = "~" then<br />
    	tell application "System Events"<br />
    		set ImageFileNamePath to (POSIX path of home folder) & (characters 2 thru end of ImageFileNamePath) as string<br />
    	end tell<br />
    end if<br />
     

    of

    <br />
    set ImageFileNamePath to do shell script "ls -d " & ImageFileNamePath<br />
     
    Bijdrager
    Sumar

    Gevonden! ls commando in terminal doet het:

    <br />
    	set yy to "ls " & "~/Desktop/jumi_pack_2.0.6_for_J1.5.zi"<br />
    	set xxx to ""<br />
    	try<br />
    		set xxx to (do shell script yy)<br />
    	end try<br />
     

    als xxx = “” is dan is het bestand niet gevonden, anders komt de volledige naam daar te staan -))

    [Edit] Hoe zet ik opgelost in de titel neer ?

    Bijdrager
    Sumar

    Hierbij de volledige (werkende) code voor de liefhebbers:

    </p>
    <p>on CheckOfBestandBestaat(pTheFile)</p>
    <p>	(*<br />
    	example:<br />
    	set thefile to ("~/Desktop/Check Active Process.scpt")<br />
    		or<br />
    	set thefile to ("/Desktop/Check Active Process.scpt")</p>
    <p>	set xxx to CheckOfBestandBestaat(thefile)<br />
    	display dialog xxx</p>
    <p>	if xxx = "" then file does not exists....<br />
    	*)</p>
    <p>	set PathHomeDir to POSIX path of (path to home folder) as string</p>
    <p>	set AppleScript's text item delimiters to "~/"<br />
    	set NormalDir to text item 1 of pTheFile<br />
    	if NormalDir = "" then set NormalDir to PathHomeDir & text item 2 of pTheFile<br />
    	set AppleScript's text item delimiters to ""</p>
    <p>	set NormalDir to (quoted form of NormalDir) -- ivm spaties</p>
    <p>	set FileBestaat to ""<br />
    	try<br />
    		set FileBestaat to (do shell script "ls " & NormalDir)<br />
    	end try</p>
    <p>	-- "" (lege string) als deze niet bestaat<br />
    	-- volledig pad (dus zonder ~) als deze wel bestaat<br />
    	return FileBestaat</p>
    <p>end CheckOfBestandBestaat<br />
     
    Bijdrager
    Pieterr
    Sumar op 08 november 2010

    Hierbij de volledige (werkende) code voor de liefhebbers:

    Heerlijk om te zien hoe “goed” de “code” tag werkt op OMT.:cry:

    Bijdrager
    dj bazzie wazzie

    Het komt misschien niet veel voor maar jou code loopt mis wanneer je in je bestandsnaam ook ~/ hebt staan. (text item 2 is dan incompleet). Een andere fout zie ik wanneer iemand een pad zou opgeven dat wel kan uitvoeren maar niet bestaat. Daarnaast is het gebruiken maken van try catch in combinatie met ls om te kijken of een bestand bestaat overkill en erg ongebruikelijk. Soms kan je niet anders dan een try catch bouwen wanneer het niet op te vangen is met if conditie zoals bij open for access. UNIX biedt naast de Finder zelf ook een test applicatie aan waarmee je kan kan testen op een bestand waaronder of het bestaat ja of nee, of dat dat het een map is, een link etc…

    <br />
    on fileExists(filePath)<br />
    	if filePath starts with "~" then<br />
    		set filePath to (POSIX path of (path to home folder) as string) & characters 3 thru -1 of filePath as string<br />
    	end if<br />
    	return not ((do shell script "test -e " & quoted form of filePath & "; echo $?") as integer) as boolean<br />
    end fileExists<br />
     
11 berichten aan het bekijken - 1 tot 11 (van in totaal 11)

Je moet ingelogd zijn om een reactie op dit onderwerp te kunnen geven.