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