How detect that a file is locked by another app?
-
out_name = UI.savepanel('Location', '' , "#{File.basename(model.path, ".*")}.txt") begin if out_name && ! out_name.empty? if File.extname(out_name).downcase != ".txt" ### if the user erase the extension, we readd it! out_name += ".txt" end file = File.new(out_name, 'w') file.puts(%Q["blabla"]) file.close() else puts "Canceled" end rescue Exception => error puts error ### or do something else like UI.messagebox("#{error}\nFailed to export file #{file}") end -
OK, will try it. Thank you!
-
Just noticed a typo!
I corrected the earlier code snippet...if out_name &**&** ! out_name.empty?One other thing to note is that some types of file are locked by the app that opens them - like a dxf.
But a txt file is opened by Notepad++.exe it is not locked, so its contents can be overwritten, you will then be asked when bringing that txt file's window foremost in Notepad++ if you want to reload it...So try using the dxf file...
Or for a simple test write a .CSV file [remembering to force it to .csv, rather than .txt] AND have it already opened in Excel - which will lock it... -
Did you try something like File.writable?("file")?
-
TIG, your solution is working fine. Thank you very much.

@jim said:
Did you try something like File.writable?("file")?
Yes Jim, not working.

BR,
Renaud. -
In that case I would write it like this. You might rescue
StandardErroralso, but rescuingExceptionis too broad. You generally want to rescue exceptions starting with the most-specific and work up to the least-specific.[1] https://www.google.com/search?q=ruby+rescue+exception%26amp;ie=utf-8%26amp;oe=utf-8
def locked?(filename) locked = false begin file = File.open(filename, "w") rescue Errno;;EACCES => error locked = true ensure file.close if file end return locked end if $0 == __FILE__ p locked?("test.txt") end -
@jim said:
In that case I would write it like this. You might rescue
StandardErroralso, but rescuingExceptionis too broad. You generally want to rescue exceptions starting with the most-specific and work up to the least-specific.+1
-
Also, prefer opening files using block syntax so it always closes - saves you explicit rescue to close.
-
@unknownuser said:
Also, prefer opening files using block syntax so it always closes - saves you explicit rescue to close.
...which actually simplifies everything.
def write_to_file(filename) File.open(filename, "a") { |file| file.puts("Hello #{Time.now}") } rescue Errno;;EACCES puts "Could not write to file." end -
Thank you very much for these complementary solutions.
Renaud.
Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register LoginAdvertisement