> On Jun 10, 2018, at 5:49 AM, Peter J. Holzer <hjp-pyt...@hjp.at> wrote:
> 
> On 2018-06-07 12:47:15 +0000, Steven D'Aprano wrote:
>> But it doesn't do that. "Pathnames cannot contain NUL" is a falsehood 
>> that programmers wrongly believe about paths. HFS Plus and Apple File 
>> System support NULs in paths.
> [...]
>> But in the spirit of compromise, okay, let's ignore the existence of file 
>> systems like HFS which allow NUL. Apart from Mac users, who uses them 
>> anyway? Let's pretend that every file system in existence, now and into 
>> the future, will prohibit NULs in paths.
> 
> Could you (or anybody else who owns a Mac) please do the following:
> 
> * Create an empty directory
> * In this directory, create two files:
>  * One with an embedded \0 in the file name

I don’t know how to do this.  I can’t enter a Nul in Finder.  Bash silently 
converts it to a zero when using it as a file name.  C considers the previous 
character the end of the file name.  Python considers it an error.

>  * One with an embedded / in the file name

This is easily done in Finder, where I created a folder named "my/slash”.  
When I list it at the command line in Terminal, this shows up as "my:slash”, 
with the slash shown as a colon.  
If I create a file with a colon in its name at the command line, that file name 
acts the same way:

$ touch ‘my:colon"
$ ls
my:colon
my:slash

In Finder they both display as:
my/colon
my/slash

However, if you use Finder’s “Copy item as Pathname” option, then you will 
again see the colon.  

/Users/bev/Training/myPython/pygroup/files/my:colon
/Users/bev/Training/myPython/pygroup/files/my:slash

But if you paste that folder’s name in Finder’s “Go to Folder” option, it 
converts it to the following, and goes to that folder:

/Users/bev/Training/myPython/pygroup/files/my/slash/slash

So we can see three (3) separate behaviors for the same folder in Finder.  This 
is because at some higher level, Apple’s file systems reserve the colon for the 
path separator, in stead of the slash.  I know that AppleScript does use the 
colon as a path separator.  However at a lower level, macOS still uses the 
slash, rather than colon, as the path name separator.  IMO, this is confusing.  
Similarly in Finder file names are case insensitive, but case preserving.  At 
the command line they are still case sensitive.  Note that it’s possible to 
format a disk with a fully case sensitive file system, but that’s not the 
default.

Please note that I am not an Apple HFS+ or AFS file system expert, by any 
stretch of the imagination.  So please excuse me if I did’t state things 
perfectly.

> * Compile and run this C program in the directory and post the output:
> 
>    #include <stdio.h>
>    #include <sys/types.h>
>    #include <dirent.h>
> 
>    int main(void) {
>        DIR *dp;
>        struct dirent *de;
>        char *p;
> 
>        dp = opendir(".");
>        while ((de = readdir(dp)) != NULL) {
>            printf("%ld -", (long)de->d_ino);
>            for (p = de->d_name; *p; p++) {
>                printf(" %02x", (unsigned char)*p);
>            }
>            printf("\n");
>        }
>        return 0;
>    }

I added printing the file name.  As suspected, the “slash” is a colon:

. - 56096374 - 2e
.. - 56095464 - 2e 2e
.DS_Store - 56109197 - 2e 44 53 5f 53 74 6f 72 65
my:colon - 56095933 - 6d 79 3a 63 6f 6c 6f 6e
my:slash - 56095521 - 6d 79 3a 73 6c 61 73 68

> Bonuspoints for doing this on an USB stick and then mounting the USB
> stick on a Linux system and posting the output there as well.
> 
Sorry, I don’t have Linux, but I suspect it’s the same as the macOS command 
line.

> I'm really curious how MacOS maps those characters in the POSIX API.
> 
>        hp

Bev in TX



-- 
https://mail.python.org/mailman/listinfo/python-list

Reply via email to