This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of TS status.

### 2625. [filesys.ts] [PDTS] Copying equivalent paths effects not specified

Section: 15.4 [filesys.ts::fs.op.copy_file] Status: TS Submitter: CH-15 Opened: 2014-01-20 Last modified: 2017-07-30

Priority: Not Prioritized

View all issues with TS status.

Discussion:

Addresses: filesys.ts

Even if `to` and `from` are different paths, they may be equivalent.

Specify what happens if `(options & copy_options::overwrite_existing)` but `from` and `to` resolve to the same file.

[2014-02-09, Beman Dawes: Need advice on this issue:]

What do existing implentations do?

Possible resolutions:

1. Treat it as an error.
2. Once equivalence is determined, take no further action and return true? false?
3. Don't bother to detect a file overwriting itself. This will likely result in an error, anyhow.

[2014-02-13 LWG/SG-3 Issaquah: LWG/SG-3 decided to treat equivalence in this case as an error. Beman to provide wording.]

[2014-04-09 Beman provided wording as requested. The Effects were rewritten to increase clarity. Behavior remains unchanged except for treating equivalence as an error.]

[17 Jun 2014 Rapperswil LWG moves to Immediate. Jonathan Wakely will provide editorial changes to improve the presentation of bitmask values.]

Proposed resolution:

Change 15.4 [fs.op.copy_file]:

> Precondition: At most one constant from each `copy_options` option group ([enum.copy_options]) is present in `options`.

> Effects:

> > If `exists(to) &&` `!(options & (copy_options::skip_existing | copy_options::overwrite_existing | copy_options::update_existing))` report a file already exists error as specified in Error reporting (7).

> > If `!exists(to) || (options & copy_options::overwrite_existing) || ((options & copy_options::update_existing) && last_write_time(from) > last_write_time(to)) || !(options & (copy_options::skip_existing | copy_options::overwrite_existing | copy_options::update_existing))` copy the contents and attributes of the file `from` resolves to the file `to` resolves to.

> > Report a file already exists error as specified in Error reporting (7) if:

> > - `exists(to)` and `equivalent(from, to)`, or
> > - `exists(to)` and `(options & (copy_options::skip_existing | copy_options::overwrite_existing | copy_options::update_existing)) == copy_options::none.`

> > Otherwise copy the contents and attributes of the file `from` resolves to to the file `to` resolves to if:

> > - `!exists(to)`, or
> > - `exists(to)` and `(options & copy_options::overwrite_existing) != copy_options::none` , or
> > - `exists(to)` and `(options & copy_options::update_existing) != copy_options::none` and `from` is more recent than `to`, determined as if by use of the `last_write_time` function.

> > Otherwise no effects.

> Returns: `true` if the `from` file was copied, otherwise `false`. The signature with argument `ec` return `false` if an error occurs.

> Throws: As specified in Error reporting (7).

> Complexity: At most one direct or indirect invocation of `status(to)`.