Writing out temp files - How to cleanly delete when done?
-
I am planning on writing out a bunch of temp files while the user is making the model. So far so good (thanks to Thom and TIG). I am trying to think through how to delete these temp files when they close out of the model, or open a new model, or SketchUp crashes on them, etc. Is this just dooming myself for a terrible mess of sloppy leftover temp files? Is there a reliable to know that SU has ended/crashed/etc and then erase all those files?
Chris
-
-
Keep a list of every filename you create. On the next load.. check to see if the files exist, if they do.. Sketchup crashed, so delete them. Then remove the filenames from the "cleanup" list.
-
You can try using an
AppObserver
'sonQuit()
callback to delete files. Unfortunately.. there's no onCloseModel() callback yet, a bummer for the Mac, butonOpenModel()
can serve that purpose on the PC.
-
-
I don't seem to get
AppObserver.onQuit
to trigger under OSX. (Not 100% confirmed as its hard to debug during that process. But I can't make it clean up temp files I made during the session. But it does work under Windows.)
The reason I try to useAppObserver.onQuit
is that the Garbage collector doesn't seem to trigger when SketchUp exits under OSX.Even tried
ModelObserver.onDeleteModel
- but I can't get that to trigger at all. -
try:
[%(#BF0040)[at_exit { block }]](http://www.ruby-doc.org/core-1.8.6/classes/Kernel.src/M001019.html)
-
@dan rathbun said:
try:
[%(#BF0040)[at_exit { block }]](http://www.ruby-doc.org/core-1.8.6/classes/Kernel.src/M001019.html)
Well, that worked on Windows. Will try on my Mac when I get home. I guess this will be the ultimate test to see if SketchUp Ruby is killed before it can exit properly.
-
at_exit reminded me of Signal#trap.
-
Anyone with a Mac at hand able to test any of these? Getting some sort of notification when SketchUp is terminated under OSX?
( Mine is at home. ) -
have you got a test script, I can run but not write...
-
Does this look right? I am not getting any signal output - just one excepton:
SIGVTALRM reserved for Thread; can't set handler
$out = File.open(File.expand_path("~/signals"), "a") Signal.list.keys.each {|s| begin trap(s) { $out.puts(s) } rescue => e $out.puts e.inspect end } at_exit{$out.puts("at_exit")}
-
And that exception comes from when you tried to hook up all signals?
What happens if you try just
at_exit
? -
@thomthom said:
And that exception comes from when you tried to hook up all signals?
No, just on the indicated signal. The exception occurs once in the output file.
@thomthom said:
What happens if you try just at_exit ?
I get nothing.
Note this is SU7.1.6859 on Mac OSX 10.4.11
On Windows XP, I get an EXIT signal and at_exit by opening and closing SketchUp.
-
It's like SketchUp Ruby under OSX is killed before it's allowed to exit properly... everything seem mute. Observers and normal Ruby callbacks are all mute...
-
I tried
at_exit
under OSX 10.5, SU8. Also nothing. -
Lame. I don't mind cleaning up the files the next time SU opens, but I'm concerned about deleting files that are supposed to be open - like 2 SketchUp widnows up simultaneously. I don't want to delete files for another model that is active.
-
@chris fullmer said:
... I'm concerned about deleting files that are supposed to be open - like 2 SketchUp widnows up simultaneously. I don't want to delete files for another model that is active.
Ok the first step in solving this, is to include the
Process.pid
(aka$$
,) number as part of the tempfile name.Part two will involve checking to see if that process id is currently in use. If the file's
pid
, is not THIS Ruby'spid
, and is not found as ANOTHER sketchup.exe'spid
, then the file is safe to delete.Jim and I were discussing how to check for pids in another topic, I think in regard to his Launcher applet (Ballista).
One method is to use a command line utility that comes with Windows.
tlist.exe is one. (But I remember a gotcha for certain version of XP, I think it may not come with Home, but the user can get it by installing the "Support Tools" from their install CD.The other way is to make a WinAPI system call, using the Win32API.so library. (Which is basically what tlist.exe does.)
You can try it from the Console... type a backquoted
'tlist`` or use
%x[tlist]`, you should see the list of all running programs preceeded by their pid.so:
pidlist = %x[tlist] safe_to_delete = true pidlist.each_line{|line| break (safe_to_delete = false) if( line =~ /(sketchup.exe)/i && line.include?(filepid.to_s) )}
You can test it at the Console usingfilepid
set to the current Skectup'spid
.
Theeach_line
block shouldbreak
out, and setsafe_to_delete
tofalse
. -
Ok I found my old message between Jim & I:
@unknownuser said:
... using tlist.exe (XP) or tasklist.exe (Vista/Win7) to check when the SU process ended. (The catch is that XP Home doesn't come with tlist.exe, it must be ... installed separately*****. It comes installed standard on XP Pro, or Win Server 2003+.
***** is referring to the separate "Support Tools" installer on the Windows install CD.
AND obviously... you need to know what equivalent utility to use on Mac OSX.
-
Yeah, the Mac side of things always throws me for a loop. I never know how to do things on a Mac. Thanks for the tips on this Dan.
OH, yes now I remember. Can ruby on the Mac access multiple model objects? Would there be a way to check through SketchUp's active model or something?
-
@chris fullmer said:
OH, yes now I remember. Can ruby on the Mac access multiple model objects? Would there be a way to check through SketchUp's active model or something?
Yes the Mac edition is an MDI. Each open model has it's OWN
object_id
, but the API does not have aModels
collection.However .. ALL the open model objects belong to the current Sketchup process id.
I did BTW request a
Models
collection and various other MDI methods and observers in the last beta round. -
ok, how about this. I create the folder in SketchUp1. Then I open SketchUp 2 and try to delete the folder. But it won't let me since SketchUp1 already has the folder open. So I would just try to delete the folder, if I can delete then I can assume that no other SketchUp process had it opened. If I can't delete, then I assume that it is because there is another active SketchUp model.
Is that foolproof? Or is that bound to run into issues?
-
I am not sure if apps can "lock" folders... like they can files. But you should get an error if the folder is not empty.
I say KISS. Have each Sketchup process create and use it's own temp folder (with a pid as part of the name.). Just eliminate the possibility of two instances fighting over the same folder. That just complicates things.
At least you are cleaning up after yourself.. not like most archival utilities, that leave a temp folder behind for every dang zip file they extract.
Advertisement