[TriLUG] c++ - how to rename files

Mark Freeze mfreeze at gmail.com
Mon Dec 12 16:28:56 EST 2005


Thanks for the reference.  It helped me complete that part of my program and
I've now got the man pages installed.

I'm trying to re-write all of my VB and VFP programs with c++.  I've never
really used c++ in a live processing environment because everywhere I've
worked has been a m$ shop.  Now that I have my own place I'm trying to do
everything with c++ (in place of VB), MySQL (in place of SQLServer), and on
a Linux box instead of an NT box.  Some days I feel like I 'm totally in
charge of everything.  Really on the ball.  Other days I can't figure out
how to rename a file in c++. Hence some of the stupid  questions that I ask
from time to time.

Thanks,
Mark.



On 12/12/05, Owen Berry <oberry at trilug.org> wrote:
>
> In case you're still struggling to get the man pages installed:
>
> RENAME(2)            Linux Programmer's Manual            RENAME(2)
>
> NAME
>        rename - change the name or location of a file
>
> SYNOPSIS
>        #include <stdio.h>
>
>        int rename(const char *oldpath, const char *newpath);
>
> DESCRIPTION
>        rename  renames  a  file,  moving  it between directories if
>        required.
>
>        Any other hard links to the file (as created using  link(2))
>        are unaffected.
>
>        If  newpath  already  exists  it will be atomically replaced
>        (subject to a few conditions - see ERRORS  below),  so  that
>        there  is  no  point  at which another process attempting to
>        access newpath will find it missing.
>
>        If newpath exists but the operation fails  for  some  reason
>        rename  guarantees to leave an instance of newpath in place.
>
>        However, when overwriting there will probably be a window in
>        which  both  oldpath  and  newpath  refer  to the file being
>        renamed.
>
>        If oldpath refers to a symbolic link the link is renamed; if
>        newpath refers to a symbolic link the link will be overwrit-
>        ten.
>
> RETURN VALUE
>        On success, zero is returned.  On error, -1 is returned, and
>        errno is set appropriately.
>
> ERRORS
>        EISDIR newpath  is an existing directory, but oldpath is not
>               a directory.
>
>        EXDEV  oldpath and newpath are not on the same filesystem.
>
>        ENOTEMPTY or EEXIST
>               newpath is  a  non-empty  directory,  i.e.,  contains
>               entries other than "." and "..".
>
>        EBUSY  The  rename  fails  because  oldpath  or newpath is a
>               directory that is in use by some process (perhaps  as
>               current  working  directory, or as root directory, or
>               because it was open for reading) or is in use by  the
>               system (for example as mount point), while the system
>               considers this an error.   (Note  that  there  is  no
>               requirement  to return EBUSY in such cases - there is
>               nothing wrong with doing the rename anyway -  but  it
>               is  allowed to return EBUSY if the system cannot oth-
>               erwise handle such situations.)
>
>        EINVAL The new pathname contained a path prefix of the  old,
>               or,  more  generally,  an  attempt was made to make a
>               directory a subdirectory of itself.
>
>        EMLINK oldpath already has the maximum number  of  links  to
>               it,  or it was a directory and the directory contain-
>               ing newpath has the maximum number of links.
>
>        ENOTDIR
>               A component used as a directory in oldpath or newpath
>               is  not,  in  fact,  a  directory.   Or, oldpath is a
>               directory, and newpath exists but is not a directory.
>
>        EFAULT oldpath  or  newpath  points  outside your accessible
>               address space.
>
>        EACCES Write access to the directory containing  oldpath  or
>               newpath  is  not  allowed for the process's effective
>               uid, or one of the directories in oldpath or  newpath
>               did not allow search (execute) permission, or oldpath
>               was a directory and did not  allow  write  permission
>               (needed to update the ..  entry).
>
>        EPERM or EACCES
>               The  directory  containing oldpath has the sticky bit
>               set and the process's effective uid is  neither  that
>               of  root  nor  the  uid of the file to be deleted nor
>               that of the directory containing it, or newpath is an
>               existing file and the directory containing it has the
>               sticky bit set and the  process's  effective  uid  is
>               neither  that  of  root nor the uid of the file to be
>               replaced nor that of the directory containing it,  or
>               the  filesystem  containing pathname does not support
>               renaming of the type requested.
>
>        ENAMETOOLONG
>               oldpath or newpath was too long.
>
>        ENOENT A directory component in oldpath   or   newpath  does
>               not exist or is a dangling symbolic link.
>
>        ENOMEM Insufficient kernel memory was available.
>
>        EROFS  The file is on a read-only filesystem.
>
>        ELOOP  Too many symbolic links were encountered in resolving
>               oldpath or newpath.
>
>        ENOSPC The device containing the file has no  room  for  the
>               new directory entry.
>
> CONFORMING TO
>        POSIX, 4.3BSD, ANSI C
>
> BUGS
>        On NFS filesystems, you can not assume that if the operation
>        failed the file was not renamed.  If  the  server  does  the
>        rename  operation  and  then  crashes, the retransmitted RPC
>        which will be processed when the server is up again causes a
>        failure.   The  application  is  expected to deal with this.
>        See link(2) for a similar problem.
>
> SEE ALSO
>        link(2), unlink(2), symlink(2), mv(1)
>
> Linux 2.0                    1998-06-04                   RENAME(2)
>
> Owen
>
> On Mon, 2005-12-12 at 11:57 -0500, Mark Freeze wrote:
> > Thanks for the tip. For something this simple thanks also for not
> sending
> > the dreaded RTFM reply.  'man 2 rename' tells me that there is no entry
> for
> > section 2.  Am I missing something?  'man rename' (which I did at least
> > check before posting...) is from the Perl programmers reference...  at
> least
> > on my system.
> >
> > Thanks,
> > Mark.
>
> --
> TriLUG mailing list        : http://www.trilug.org/mailman/listinfo/trilug
> TriLUG Organizational FAQ  : http://trilug.org/faq/
> TriLUG Member Services FAQ : http://members.trilug.org/services_faq/
>



More information about the TriLUG mailing list