# Readdir return full path

**URL:** <https://discourse.julialang.org/t/readdir-return-full-path/15274>\
**Category:** Internals & Design\
**Tags:** proposal\
**Created:** [September 21, 2018, 12:57pm UTC](https://discourse.julialang.org/t/readdir-return-full-path/15274 "2018-09-21T12:57:47Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![yakir12](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/yakir12/32/297_2.png) [@yakir12](https://discourse.julialang.org/u/yakir12)\
**Post date:** [September 21, 2018, 12:57pm UTC](https://discourse.julialang.org/t/readdir-return-full-path/15274/1 "2018-09-21T12:57:47Z")

</div>

How useful do you people think it would be for `readdir(dir)` to return the **full path name** of the files and directories in directory `dir`?

```julia
julia> path = "/home/yakir/tmp"
"/home/yakir/tmp"

julia> readdir(path)
3-element Array{String,1}:
 "/home/yakir/tmp/screenshot_2018-09-21_13:47:12.png"
 "/home/yakir/tmp/screenshot_2018-09-21_13:51:51.png"
 "/home/yakir/tmp/screenshot_2018-09-21_14:15:28.png"

```

Not as default, but at least as an option. Maybe something like `readdir(dir; joinpath=true)`?

---

<div class="post-metadata">

**Author:** ![tk3369](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tk3369/32/2824_2.png) [@tk3369](https://discourse.julialang.org/u/tk3369)\
**Post date:** [September 21, 2018, 3:23pm UTC](https://discourse.julialang.org/t/readdir-return-full-path/15274/2 "2018-09-21T15:23:38Z")

</div>

Yes I like that 👍

---

<div class="post-metadata">

**Author:** ![stevengj](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/stevengj/32/71_2.png) [@stevengj](https://discourse.julialang.org/u/stevengj)\
**Post date:** [September 21, 2018, 3:27pm UTC](https://discourse.julialang.org/t/readdir-return-full-path/15274/3 "2018-09-21T15:27:50Z")

</div>

You can also do `joinpath.(abspath(dir), readdir(dir))` if you want this behavior.

---

<div class="post-metadata">

**Author:** ![ElOceanografo](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/eloceanografo/32/624_2.png) [@ElOceanografo](https://discourse.julialang.org/u/ElOceanografo)\
**Post date:** [September 21, 2018, 3:46pm UTC](https://discourse.julialang.org/t/readdir-return-full-path/15274/4 "2018-09-21T15:46:11Z")

</div>

I like it too. R’s `list.files` gives you this option, and not having it in Julia is a consistent (albeit minor) inconvenience.

---

<div class="post-metadata">

**Author:** ![tk3369](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tk3369/32/2824_2.png) [@tk3369](https://discourse.julialang.org/u/tk3369)\
**Post date:** [September 21, 2018, 3:58pm UTC](https://discourse.julialang.org/t/readdir-return-full-path/15274/5 "2018-09-21T15:58:27Z")

</div>

That’s exactly what I do but i imagine that many people are doing the same hence I think it’s a good suggestion.

---

<div class="post-metadata">

**Author:** ![js135005](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/js135005/32/8219_2.png) [@js135005](https://discourse.julialang.org/u/js135005)\
**Post date:** [September 21, 2018, 4:06pm UTC](https://discourse.julialang.org/t/readdir-return-full-path/15274/6 "2018-09-21T16:06:37Z")

</div>

I’m in favour of having the option as well.

---

<div class="post-metadata">

**Author:** ![halleysfifthinc](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/halleysfifthinc/32/206280_2.png) [@halleysfifthinc](https://discourse.julialang.org/u/halleysfifthinc)\
**Post date:** [September 21, 2018, 4:29pm UTC](https://discourse.julialang.org/t/readdir-return-full-path/15274/7 "2018-09-21T16:29:33Z")

</div>

Alternately, a keyword argument would allow the best of both worlds.

```julia
julia> pwd()
"home/yakir/tmp"

julia> readdir(pwd(); abspath=true)
3-element Array{String,1}:
 "/home/yakir/tmp/screenshot_2018-09-21_13:47:12.png"
 "/home/yakir/tmp/screenshot_2018-09-21_13:51:51.png"
 "/home/yakir/tmp/screenshot_2018-09-21_14:15:28.png"

```

---

<div class="post-metadata">

**Author:** ![yakir12](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/yakir12/32/297_2.png) [@yakir12](https://discourse.julialang.org/u/yakir12)\
**Post date:** [September 21, 2018, 4:32pm UTC](https://discourse.julialang.org/t/readdir-return-full-path/15274/8 "2018-09-21T16:32:50Z")

</div>

Yea, that’s what I meant. The default can be `abspath=false` and no one would need worry. The performance would be almost identical, right?

---

<div class="post-metadata">

**Author:** ![halleysfifthinc](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/halleysfifthinc/32/206280_2.png) [@halleysfifthinc](https://discourse.julialang.org/u/halleysfifthinc)\
**Post date:** [September 21, 2018, 4:35pm UTC](https://discourse.julialang.org/t/readdir-return-full-path/15274/9 "2018-09-21T16:35:24Z")

</div>

My guess is that the IO would dwarf any performance hit from the kwargs.

---

<div class="post-metadata">

**Author:** ![yakir12](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/yakir12/32/297_2.png) [@yakir12](https://discourse.julialang.org/u/yakir12)\
**Post date:** [September 21, 2018, 6:52pm UTC](https://discourse.julialang.org/t/readdir-return-full-path/15274/10 "2018-09-21T18:52:18Z")

</div>

[Submitted](https://github.com/JuliaLang/julia/issues/29309).

---

<div class="post-metadata">

**Author:** ![tamasgal](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tamasgal/32/27946_2.png) [@tamasgal](https://discourse.julialang.org/u/tamasgal)\
**Post date:** [August 20, 2019, 3:07pm UTC](https://discourse.julialang.org/t/readdir-return-full-path/15274/11 "2019-08-20T15:07:44Z")

</div>

I literally wanted to propose the exact same feature and implementation 😉

---

<div class="post-metadata">

**Author:** ![mbauman](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mbauman/32/31082_2.png) [@mbauman](https://discourse.julialang.org/u/mbauman)\
**Post date:** [August 20, 2019, 3:57pm UTC](https://discourse.julialang.org/t/readdir-return-full-path/15274/12 "2019-08-20T15:57:42Z")

</div>

Are there ever cases where you don’t eventually need a `joinpath` on the results? I suppose `readdir()` (in the cwd) is one such case, as is the interactive “what’s in this folder” case (but I use `;ls` for that). I think every time I’ve done a `readdir` I’ve needed to do a subsequent `joinpath`. Of course we can’t change the default now, but adding a keyword option seems reasonable. 👍

I’m not sure the keyword name should be `abspath` as the point isn’t getting an absolute path, but rather it’s to join the directory to each result so you can immediately reference the results directly from the same CWD.

---

<div class="post-metadata">

**Author:** ![DNF](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dnf/32/10191_2.png) [@DNF](https://discourse.julialang.org/u/DNF)\
**Post date:** [August 20, 2019, 4:25pm UTC](https://discourse.julialang.org/t/readdir-return-full-path/15274/13 "2019-08-20T16:25:07Z")

</div>

Yeah, it shouldn’t be `abspath`, but rather `joinpath`, or just `join` (the `path` part is implied.) The shorter the better.

---

<div class="post-metadata">

**Author:** ![tamasgal](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tamasgal/32/27946_2.png) [@tamasgal](https://discourse.julialang.org/u/tamasgal)\
**Post date:** [August 21, 2019, 8:44am UTC](https://discourse.julialang.org/t/readdir-return-full-path/15274/14 "2019-08-21T08:44:56Z")

</div>

I think `abspath` is more explicit, since if you do `readdir("foo/bar", join=true)`, you might expect that you will get `foo/bar/*`. `abspath` on the other hand would suggest that you will get `/the/absolute/path/to/foo/bar/*`.

Of course, all this only holds if we want the absolute path to be returned 😉 I think in most cases it doesn’t make a difference if it’s relative or absolute…

---

<div class="post-metadata">

**Author:** ![DNF](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dnf/32/10191_2.png) [@DNF](https://discourse.julialang.org/u/DNF)\
**Post date:** [August 21, 2019, 8:49am UTC](https://discourse.julialang.org/t/readdir-return-full-path/15274/15 "2019-08-21T08:49:38Z")

</div>

I had assumed that the desired behaviour was to return `foo/bar/*`, _not_ the absolute path. Perhaps that could be a _third_ alternative.

---

<div class="post-metadata">

**Author:** ![tamasgal](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tamasgal/32/27946_2.png) [@tamasgal](https://discourse.julialang.org/u/tamasgal)\
**Post date:** [August 21, 2019, 8:59am UTC](https://discourse.julialang.org/t/readdir-return-full-path/15274/16 "2019-08-21T08:59:31Z")

</div>

Btw. I totally overlooked that all of the suggested keywords (`abspath`, `join` and `joinpath`) are already defined functions… 🙈

---

<div class="post-metadata">

**Author:** ![DNF](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dnf/32/10191_2.png) [@DNF](https://discourse.julialang.org/u/DNF)\
**Post date:** [August 21, 2019, 9:00am UTC](https://discourse.julialang.org/t/readdir-return-full-path/15274/17 "2019-08-21T09:00:12Z")

</div>

I don’t think that’s a problem. Is it?

---

<div class="post-metadata">

**Author:** ![tamasgal](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tamasgal/32/27946_2.png) [@tamasgal](https://discourse.julialang.org/u/tamasgal)\
**Post date:** [August 21, 2019, 9:01am UTC](https://discourse.julialang.org/t/readdir-return-full-path/15274/18 "2019-08-21T09:01:03Z")

</div>

Well, those functions will be “overwritten” inside the `readdir()` function’s scope.

---

<div class="post-metadata">

**Author:** ![tamasgal](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tamasgal/32/27946_2.png) [@tamasgal](https://discourse.julialang.org/u/tamasgal)\
**Post date:** [August 21, 2019, 9:01am UTC](https://discourse.julialang.org/t/readdir-return-full-path/15274/19 "2019-08-21T09:01:41Z")

</div>

Ah, you mean with using `Base.X`

---

<div class="post-metadata">

**Author:** ![tamasgal](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tamasgal/32/27946_2.png) [@tamasgal](https://discourse.julialang.org/u/tamasgal)\
**Post date:** [August 21, 2019, 9:40am UTC](https://discourse.julialang.org/t/readdir-return-full-path/15274/20 "2019-08-21T09:40:33Z")

</div>

I successfully procrastinated writing my PhD thesis and created a tiny PR: [https://github.com/JuliaLang/julia/pull/33004](https://github.com/JuliaLang/julia/pull/33004)

Maybe someone can help me with the unit tests, I am not able to run the test suite (I get several segfaults) 😉

[Next page](https://discourse.julialang.org/t/readdir-return-full-path/15274.md?page=2)
