Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I make Windows file-locking more like UNIX file-locking?

Tags:

UNIX file-locking is dead-easy: The operating system assumes that you know what you are doing and lets you do what you want:

For example, if you try to delete a file which another process has opened the operating system will usually let you do it. The original process still keeps it's file-handles until it terminates - at which point the the file-system will quietly re-cycle the disk-resources. No fuss, that's the way I like it.

How different things are on Windows: If I try to delete a file which another process is using I get an Operating-System error. The file is untouchable until the original process releases it's lock on the file. That was great back in the single-user days of MS-DOS when any locking process was likely to be on the same computer that contained the files, however on a network it's a nightmare:

Consider what happens when a process hangs while writing to a shared file on a Windows file-server. Before the file can be deleted we have to locate the computer and ID the process on that computer which originally opened the file. Only then can we kill the process and delete our unwanted file.

What a nuisance!

Is there a way to make this better? What I want is for file-locking on Windows to behave a like file-locking in UNIX. I want the operating system to just let me do what I want because I'm in charge and I know what I'm doing...

...so can it be done?

like image 754
Salim Fadhley Avatar asked Feb 13 '09 16:02

Salim Fadhley


People also ask

What are different types of file locks?

Two kinds of locks are offered: shared locks and exclusive locks. In the case of fcntl , different kinds of locks may be applied to different sections (byte ranges) of a file, or else to the whole file.

What is global file locking?

Global file locking is similar to the file locking mechanism that a network-attached storage or file server uses to make sure that only one copy of a file is being edited at the same time. Global file locking takes that concept and applies it to a cloud implementation.

How do I put a lock on a file?

Navigate to the folder or file you want to encrypt. Right-click on the item, click Properties, then click Advanced. Check Encrypt contents to secure data. Click OK, then click Apply.


2 Answers

No. Windows is designed for the "average user", that is people who don't understand anything about a computer. Therefore, the OS tries to be smart to avoid PEBKACs. To quote Bill Gates: "There are no issues with Windows that any number of people want to be fixed." Of course, he knows that 99.9999% of all Windows users can't tell whether the program just did something odd because of them or the guy who wrote it.

Unix was designed when the world was more simple and anyone close enough to a computer to touch it, probably knew how to assemble it from dirty sand. Therefore, the OS usually lets you do what you want because it assumes that you know better (and if you didn't, you will next time).

Technical answer: Unix allocates an "i-nodes" if you create a file. I-nodes can be shared between processes. If two processes create the same file (that is, two processes call create() with the same path), then you end up with two i-nodes. This is by design. It allows for a fancy security feature: You can create files which no one can open but yourself:

  1. Open a file
  2. Delete it (but keep the file handle)
  3. Use the file any way you like
  4. Close the file

After step #2, the only process in the universe who can access the file is the one who created it (unless you want to read the hard disk block by block). The OS will keep the data alive until you either close the file or your process dies (at which time Unix will clean up after you).

This design is the foundation of all Unix filesystems. The Windows file system NTFS works much the same way but the high level API is different. Many applications open files in exclusive mode (which prevents anyone, even backup programs) to read the file. This is even true for applications which just display information like PDF viewers.

That means you'll have to fix all the Windows applications to achieve the desired effect. If you have access to the source, you can create a file in a shared mode. That would allow other processes to access it at the same time but then, you will have to check before every read/write if the file still exists, whether someone has made changes, etc.

like image 200
Aaron Digulla Avatar answered Sep 27 '22 19:09

Aaron Digulla


According to MSDN you can specify to CreateFile() 3rd parameter (dwSharedMode) shared mode flag FILE_SHARE_DELETE which:

Enables subsequent open operations on a file or device to request delete access.

Otherwise, other processes cannot open the file or device if they request delete access.

If this flag is not specified, but the file or device has been opened for delete access, the function fails.

Note Delete access allows both delete and rename operations.

http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx

So if you're can control your applications you can use this flag.

like image 24
bialix Avatar answered Sep 27 '22 17:09

bialix