More NIO feedback

John Hendrikx hjohn at xs4all.nl
Mon Nov 2 02:23:01 PST 2009


Alan Bateman wrote:
>> 1) Other than parsing exception message text, there's no way to 
>> distinguish a "disk full" condition and other FileSystemExceptions.  
>> Disk Full conditions are something a user can solve in the background 
>> allowing the offending operation to be retried and so I would like to 
>> inform the user of this condition in a more specific way.
>
> This one is overdue (see 4533668) and we should just do it - it's just 
> needs a bit of work to test each of the operations (writing, creation, 
> copying, ...) on each of the platforms.
Ok, I can test these for Windows/Linux if they make it in.

>> 3) I was having some trouble automagically handling retries of 
>> operations that throw AccessDeniedException.  For example, 
>> Path.delete() can throw this, and what I'm trying to achieve is to 
>> see if the Attributes can be altered in such a way (with the current 
>> privileges) that would result in the delete succeeding (a "forced" 
>> delete).
>>
>> This is somewhat harder than I expected, although not impossible.  
>> I'm writing a static class to handle these nasty details.
> If operations like delete are failing with "access denied" then it 
> could be one of many issues. Is it transient and a retry succeeds if 
> re-attempted after some time? If so, and this is Windows, then it 
> might suggest you are are trying to delete files that are in use by 
> other entities that have the DOS sharing mode explicitly set to 
> disallow delete or they have file mapped into memory. A "forceful" 
> delete can't do very much here except back-off for a time, retry, and 
> "hope" that the other process is done.
>
> On other hand, maybe you asking that the file permissions or ACL be 
> changed prior to delete to improve the chance that the file can be 
> deleted?
It's purely a way to help the user to get a file deleted.  Telling the 
user that Access is denied could mean many things, ranging from lack of 
permissions, to the file being in use to it simply being read-only.  
Basically, I'm trying to give better feedback, and in the simple cases I 
want to try to "fix" the problem (like clearing the read-only flag).

It's like Explorer telling you: "File_01 is read-only, do you want to 
remove it anyway?" -- if you confirm, it makes the file deletable (in 
this case just clears the read-only flag) and deletes it. 

I realize though that what I'm asking is very specific, and the reason 
I'm mentioning it is just to get some feedback as well.   From what it 
looks like though I will try and just handle the simple cases:

For DOS clear read only flag if set and try again (which may mean I need 
to set the flag again if it still fails to avoid making a mess of things).

For Posix, see if I can set Owner Write flag (if the user is the owner), 
and maybe something similar for groups (although I don't think I can 
find out what groups a user belongs to).

For ACL's... well that gets even more complicated, so I guess those will 
need to be dealt with by the user.

It would be good though if I could distinguish between a temporary 
condition (File is in use) and a more permanent condition (lack of 
permissions).
>> 5) Is there any way to obtain FileStore specific parameters, like:
>> - case sensitivity
>> - limitations (max name length, max file size)
>> - charset
>> - soft/hard link support available
>> - sparse file creation
> Not in the standard API but the attribute support is very extensible 
> by providers. At one point we did look at supporting a way to test if 
> a FileStore supported symbolic and/or hard links but it's just not 
> feasible/reliable when the file system is remote. 
Ok, I was hoping it would be possible to find out this part atleast.  
Although there's no guarantee any operation will succeed at all of 
course, just trying the creation of a symbolic link and catching the 
resulting exception will have to do for now.

> Case sensitivity is a lot more complicated than it might it seem. For 
> example, knowing if a file system is case sensitive and/or case 
> preserving isn't sufficient. You need to know if the file system is 
> unicode or bytes. If Unicode you need to know about normalization and 
> other treatment of characters. NTFS is the extreme with a per volume 
> table for case mapping. "Limitations" is also complex as it also 
> requires knowing a lot about the underlying volume/file system and 
> knowing how it behaves when presented with a file name that exceeds a 
> maximum length (does it fail, is it truncated?, etc.). As with the sym 
> link capabilities we get into feasibility issues when the file system 
> is remote. Is knowing the "sparse file creation" useful? I don't think 
> this has been asked for before.
I suppose this is near impossible, especially charset and name 
limitations can get very tricky.  Long ago I wrote my own filesystem, 
and if I would have to give you its limitations it would be something like:

- case sensitive or case preserving depending on format parameters
- max name length, 255 bytes (all bytes allowed except '/', ':' and 
'\0'), fail when length is exceeded
- max file length, 2^32 - 1 bytes
- max volume size: 1 TB, with block size of 512 bytes, more with larger 
blocksizes
- charset: none, raw bytes, see limitation above

The only one of these that really is annoying is when names get 
truncated -- it would mean the system just created a file with some 
name, but then would be unable to locate it again as the name is 
truncated in some unknown way :)

As for sparse file creation, it may not be very useful to know about 
this.  NIO already ignores the SPARSE option when it is not supported, 
which should work fine.

--John


More information about the nio-dev mailing list