Need a way to determine if a file is done being written to
I ended up resolving it for our situation. As it turns out the process that was writing the files out had them opened exclusively so all we had to do was try opening them for read access - when denied they were in use.
How to verify file is finished being written before attempting to process it?
First yes it compiles look a the solution I posted in relation to the code In my question. You substitute
For(File file: dir){
while(!file.renameTo(file)){
Thread.sleep(1)
}
// In my code I check to see if the file name is already in the list which
// contains files that have been previously loaded if its not I add it to a list
// of files to be processed
}
in for
for (File file : dir) {
if (!loaded.contains(file.getName())) {
long filesize = 0;
boolean cont = true;
while (cont) {
if (file.length() == filesize) {
cont = false;
Thread.sleep(3);
filesToLoad.add(file);
}
else {
filesize = file.length();
Thread.sleep(3);
}
}
Thread.sleep(3);
}
}
sorry I forgot to put comment tags // in on the line that said do what every you need to do here.
What it does is it looks at each file in the directory and checks to see if you can rename it if the rename fails it sleeps and continues checking till it sucessfully is able to rename at which point you can do what you need to with the file which in my case was everything after the for loop that was replaced. I'm curious why my awnser was viewed as sub par deleted and locked. This solution does work and solved my problem and would anyone else who's having the same issue attempting to process a file that still being written or copied to a directory thats being monitored for changes.
Checking if file is completely written
Does the producer process close the file when its finished writing? If so, trying to open the file in the consumer process with an exclusive lock will fail if the producer process is still producing.
How to test if a file is complete (completely written) with Java
You could use an external marker file. The writing process could create a file XYZ.lock before it starts creating file XYZ, and delete XYZ.lock after XYZ is completed. The reader would then easily know that it can consider a file complete only if the corresponding .lock file is not present.
(OS X) Determine if file is being written to?
There aren't great ways to do this.
If you can be certain that the writer is using NSFileCoordinator
, then you can also use that to coordinate your access to the file.
Likewise, if you're sure that the writer has opted in to advisory locking, you could try to open the file for shared access by calling open()
with the O_SHLOCK
and O_NONBLOCK
flags. If you succeed, then there are no other descriptors open for exclusive access. You can either use the file descriptor you've got or close it and then use some other API to access the file.
However, if you can't be sure of any of those, then your best bet may be to set a timer to repeatedly check the file's metadata (size, date modified, etc.). Only when you see that it has stopped changing over a reasonable time interval (2 seconds, maybe) would you attempt to access it (and cancel the timer).
You might want to do all three. Wait for the file's metadata to settle down, then use a NSFileCoordinator
to read from the file. When it calls your reader block, use open()
with O_SHLOCK | O_NONBLOCK
to make sure there are no other processes which have exclusive access to it.
Related Topics
Plotting the Data with Scrollable X (Time/Horizontal) Axis on Linux
How to Split a Huge CSV File Based on Content of First Column
Cron Job: How to Run a Script That Requires to Open Display
Pip Error:'Module' Object Has No Attribute 'Cryptography_Has_Ssl_St'
Can You Fool Isatty and Log Stdout and Stderr Separately
Simulate Mouse Clicks on Python
Pip Is Not Working for Python 3.10 on Ubuntu
How to Find the Owner of a File or Directory in Python
Change Working Directory in Shell with a Python Script
Python Convert Microsoft Office Docs to Plain Text on Linux
Allowing Ctrl-C to Interrupt a Python C-Extension
On Linux Suse or Redhat, How to Load Python 2.7
Dropping Root Permissions in Python
How to Do Multiple Processes for Django, on My Wsgi Apache