in reply to Re^4: Bugs in File::Find on Windows
in thread Bugs in File::Find on Windows

Depends on what you consider symetric.

To change the current drive without changing the current dir on that drive:

chdir('C:');

To change the current dir of a drive without changing the current drive:

my $drive = substr(getcwd(), 0, 2); chdir('C:\\'); chdir($drive);

Replies are listed 'Best First'.
Re^6: Bugs in File::Find on Windows
by liverpole (Monsignor) on Feb 16, 2007 at 03:03 UTC
    ikegami,

    Your first example (changing the current drive only) looks good, but I'm not sure your second example (changing the current directory of a drive):

    my $drive = substr(getcwd(), 0, 2); chdir('C:\\'); chdir($drive);

    quite works.

    Yes, it will work if you're going to the top-level directory "\", (for which you could do the simpler chdir('C:/')) but if you need to change to a directory on (for example) drive D: which doesn't exist on drive C:, then changing to C:\dir_on_drive_d will fail:

    use strict; use warnings; use Cwd qw(getcwd chdir getdcwd); # Here, D:\testdir exists, but C:\testdir does NOT my $drive = substr(getcwd(), 0, 2); chdir('C:/testdir') or die "No such directory 'C:/testdir'\n"; chdir($drive); __END__ Produces: No such directory 'C:/testdir'

    How about just using the drive and directory together, which seems to work okay:

    use strict; use warnings; use Cwd qw(chdir getdcwd); show_drives(); system("dir/w"); chdir("D:/testdir") or die "Can't change to dir 'D:/testdir' ($!)\n"; system("dir/w"); sub show_drives { printf "You are in '%s' on the current drive\n", getdcwd(); printf "You are in '%s' on the 'D' drive\n", getdcwd('D'); print "\n"; }

    which correctly displays the contents of D:\testdir after the command chdir("D:/testdir"):

    You are in 'C:\Documents and Settings\liverpole\perl' on the current d +rive You are in 'D:\testdir' on the 'D' drive Volume in drive C has no label. Volume Serial Number is E451-D99E Directory of C:\Documents and Settings\liverpole\perl [.] [..] dirtest.pl dirtest.pl~ 2 File(s) 836 bytes 2 Dir(s) 10,946,477,056 bytes free Volume in drive D is WIN2000 Volume Serial Number is EEE2-EEE2 Directory of D:\testdir [.] [..] a.txt b.txt c.txt 3 File(s) 24 bytes 2 Dir(s) 3,777,839,104 bytes free

    s''(q.S:$/9=(T1';s;(..)(..);$..=substr+crypt($1,$2),2,3;eg;print$..$/
      I'm confused. Why would you use chdir("C:\\testdir") to change the dir on D:? Do chdir("D:\\testdir") (absolute path) or chdir("D:testdir") (path relative to the current dir on D:). What am I missing?
        Excuse me if I misunderstood you.  I thought that's what you were trying to do when you said (above) to do:

        To change the current dir of a drive without changing the current drive:

        my $drive = substr(getcwd(), 0, 2); chdir('C:\\'); chdir($drive);

        It seems like you were trying to change directory based on the 'C:\\' path, and then change drives (eg. to 'D:\\').  Maybe you meant that as 3 separate (unrelated) commands?  In which case, sorry, but it wasn't clear to me what you were trying to do.


        s''(q.S:$/9=(T1';s;(..)(..);$..=substr+crypt($1,$2),2,3;eg;print$..$/