Fwd: Files.walk() is unusable because of AccessDeniedException

Gilles Habran gilleshabran at gmail.com
Wed May 25 07:39:43 UTC 2016


Hi Henry,

I knew there was a work around as I created something similar than yours
when I needed it. :)

Apparently, we have two different opinions regarding Files.walk() and how
this method is supposed to handle permissions. I just sent this email
because I felt that Files.walk() didn't behave like it should, maybe I am
wrong.

I read everything from my root directory so it makes sense that that I
don't have the permissions to read everything (I'll get the same thing when
I read /proc for sure) but what happens the day I walk the home directory
of the user as the user. I am supposed to have access to everything in
there, right ? My application will just crash if there is a dirty file in
there with bad permissions and there is nothing I can do about it... not
with Files.walk().

To be sure that I don't have a problem, I will need to create my own method
like yours because I would take a great risk using Files.walk() if I get an
exception that stops my process in case there is an unexpected file with
bad permissions.

Have a nice day.

Best regards,

Gilles

On 25 May 2016 at 08:23, Henry Jen <henry.jen at oracle.com> wrote:

> I think there is a work-around, use list() and flatMap() should get you
> what you needed.
>
> The API is designed to walk a tree where you suppose to have access with.
> If OS level cause an IOException, that need to be dealt with. Acknowledged
> that exception handling is not a strong suite in Stream API, developer will
> need to do some work.
>
> Files.find() also allows you to get entries and filter out by permission.
> What you can do is make sure you have permission on the top level, then
> call find with maxDepth 1 to only get entries on that directory.
>
> Combined with flatMap(), you should be able to get what you want. Try the
> following code to see if it works for you.
>
> import java.nio.file.Files;
> import java.nio.file.Path;
> import java.nio.file.Paths;
> import java.util.stream.Stream;
> import java.io.IOException;
>
> public class ListCanRead {
>     static Stream<Path> walkReadable(Path p) {
>         if (Files.isReadable(p)) {
>             if (Files.isDirectory(p)) {
>                 try {
>                     return Stream.concat(Stream.of(p), Files.list(p));
>                 } catch (IOException ioe) {
>                     return Stream.of(p);
>                 }
>             } else {
>                 return Stream.of(p);
>             }
>         }
>         return Stream.of(p);
>     }
>
>     public static void main(String[] args) throws IOException {
>         System.out.println("List directory: " + args[0]);
>         walkReadable(Paths.get(args[0])).flatMap(ListCanRead::walkReadable)
>             .forEach(System.out::println);
>
>         Files.walk(Paths.get(args[0]))
>             .forEach(System.out::println); // Could throw
> AccessDeniedException
>     }
> }
>
> Cheers,
> Henry
>
> On May 24, 2016 at 4:48:30 PM, Gilles Habran (gilleshabran at gmail.com)
> wrote:
> > Good morning,
> >
> > well I would like to be able to manage the outcome of the processing
> myself
> > and not get an exception in a part where I have no control.
> >
> > For example, I would expect to get an exception when I tried to read a
> file
> > where I don't have the permission. I would not expect to get an exception
> > when Java creates the Stream.
> >
> > Maybe I am the only one to have a problem with this ? I don't know but it
> > feels strange to be forced to execute a software with root permissions
> > where I don't even plan to read file I cannot read because of lack of
> > permissions.
> >
> > For me, we should be able to test the attributes of a file and depending
> on
> > the result, read the file or not. If we read the file without permission,
> > we get an exception, if not, we can go to the next file without error.
> >
> > If that's unclear, please let me know, I'll try to give more informations
> > or examples.
> >
> > Thank you.
> >
> > On 24 May 2016 at 10:19, Andrew Haley wrote:
> >
> > > On 05/20/2016 10:38 AM, Gilles Habran wrote:
> > > > why is my message still waiting for approval after a month ?
> > >
> > > What is it you want Java to do? You can't walk the directory
> > > because you don't have permission. sudo should work.
> > >
> > > Andrew.
> > >
> > >
> >
>
>



More information about the core-libs-dev mailing list