os.stat() distorts filenames that end with period (nt.stat())

R

ruck

(This with Python 2.7.2 on Windows 7)

os.stat() won't recognize a filename ending in period.
It will ignore trailing periods.
If you ask it about file 'goo...' it will report on file 'goo'
And if 'goo' doesn't exist, os.stat will complain.

create file goo, then
nt.stat_result(st_mode=33206, st_ino=0L, st_dev=0, st_nlink=0, st_uid=0, st_gid=0, st_size=0L, st_atime=1346978160L, st_mtime=1346978160L, st_ctime=1346978160L)

rename goo to "goo...", then,

Traceback (most recent call last):
File "<pyshell#16>", line 1, in <module>
os.stat('goo...')
WindowsError: [Error 2] The system cannot find the file specified: 'goo...'

Puzzling, to me at least.
Any comments?
This with Python 2.7.2 on Windows 7.
Is there a workaround?
Thanks,
John
 
D

Dave Angel

(This with Python 2.7.2 on Windows 7)

os.stat() won't recognize a filename ending in period.
It will ignore trailing periods.
If you ask it about file 'goo...' it will report on file 'goo'
And if 'goo' doesn't exist, os.stat will complain.

create file goo, then
nt.stat_result(st_mode=33206, st_ino=0L, st_dev=0, st_nlink=0, st_uid=0, st_gid=0, st_size=0L, st_atime=1346978160L, st_mtime=1346978160L, st_ctime=1346978160L)

rename goo to "goo...", then,

Traceback (most recent call last):
File "<pyshell#16>", line 1, in <module>
os.stat('goo...')
WindowsError: [Error 2] The system cannot find the file specified: 'goo...'

Puzzling, to me at least.
Any comments?
This with Python 2.7.2 on Windows 7.
Is there a workaround?
Thanks,
John

FWIW, it seems to work okay here in Linux 11.04, both Python 2.7 and 3.2
 
A

alex23

(This with Python 2.7.2 on Windows 7)
rename goo to "goo...", then,

I'm unable to rename any file to have a '...' suffix, are you certain
the file exists in the form you think after the rename?
 
R

ruck

(This with Python 2.7.2 on Windows 7)

os.stat() won't recognize a filename ending in period.
It will ignore trailing periods.
If you ask it about file 'goo...' it will report on file 'goo'
And if 'goo' doesn't exist, os.stat will complain.

create file goo, then

nt.stat_result(st_mode=33206, st_ino=0L, st_dev=0, st_nlink=0, st_uid=0, st_gid=0, st_size=0L, st_atime=1346978160L, st_mtime=1346978160L, st_ctime=1346978160L)

nt.stat_result(st_mode=33206, st_ino=0L, st_dev=0, st_nlink=0, st_uid=0, st_gid=0, st_size=0L, st_atime=1346978160L, st_mtime=1346978160L, st_ctime=1346978160L)

rename goo to "goo...", then,


Traceback (most recent call last):
File "<pyshell#16>", line 1, in <module>
os.stat('goo...')

WindowsError: [Error 2] The system cannot find the file specified: 'goo...'
Puzzling, to me at least.
Any comments?
This with Python 2.7.2 on Windows 7.
Is there a workaround?

John



FWIW, it seems to work okay here in Linux 11.04, both Python 2.7 and 3.2





--



DaveA

Thanks, I agree, I expect this is Windows 7 or win32 specific.

Also, in creating a test case to demonstrate, I may have clouded my intent.
I want to walk() a dir,
reporting the output of os.stat() for files below the dir.
One of the existing files happens to be named like "goo..."
And os.stat('goo...') fails to see the file.
I am not trying to rename the file, just hoping to stat an existing file.
John
 
R

ruck

(This with Python 2.7.2 on Windows 7)

os.stat() won't recognize a filename ending in period.
It will ignore trailing periods.
If you ask it about file 'goo...' it will report on file 'goo'
And if 'goo' doesn't exist, os.stat will complain.

create file goo, then

nt.stat_result(st_mode=33206, st_ino=0L, st_dev=0, st_nlink=0, st_uid=0, st_gid=0, st_size=0L, st_atime=1346978160L, st_mtime=1346978160L, st_ctime=1346978160L)

nt.stat_result(st_mode=33206, st_ino=0L, st_dev=0, st_nlink=0, st_uid=0, st_gid=0, st_size=0L, st_atime=1346978160L, st_mtime=1346978160L, st_ctime=1346978160L)

rename goo to "goo...", then,


Traceback (most recent call last):
File "<pyshell#16>", line 1, in <module>
os.stat('goo...')

WindowsError: [Error 2] The system cannot find the file specified: 'goo...'
Puzzling, to me at least.
Any comments?
This with Python 2.7.2 on Windows 7.
Is there a workaround?

John



FWIW, it seems to work okay here in Linux 11.04, both Python 2.7 and 3.2





--



DaveA

Thanks, I agree, I expect this is Windows 7 or win32 specific.

Also, in creating a test case to demonstrate, I may have clouded my intent.
I want to walk() a dir,
reporting the output of os.stat() for files below the dir.
One of the existing files happens to be named like "goo..."
And os.stat('goo...') fails to see the file.
I am not trying to rename the file, just hoping to stat an existing file.
John
 
T

Terry Reedy

(This with Python 2.7.2 on Windows 7)

os.stat() won't recognize a filename ending in period.
It will ignore trailing periods.
If you ask it about file 'goo...' it will report on file 'goo'
And if 'goo' doesn't exist, os.stat will complain.

create file goo, then
nt.stat_result(st_mode=33206, st_ino=0L, st_dev=0, st_nlink=0, st_uid=0, st_gid=0, st_size=0L, st_atime=1346978160L, st_mtime=1346978160L, st_ctime=1346978160L)

rename goo to "goo...", then,

Traceback (most recent call last):
File "<pyshell#16>", line 1, in <module>
os.stat('goo...')
WindowsError: [Error 2] The system cannot find the file specified: 'goo...'

Puzzling, to me at least.
Any comments?

Windows have restrictions on filenames. The restrictions are not
consistent in that some parts of Windows will let you make names that
other parts do not recognize or regard as illegal. I ran into this some
years ago and there may be a discussion on the tracker, but I have
forgetten the details except that one of the 'parts' was Windows
Explorer. This *might* be what you are running into.
 
S

Steven D'Aprano

(This with Python 2.7.2 on Windows 7)

os.stat() won't recognize a filename ending in period. It will ignore
trailing periods.
If you ask it about file 'goo...' it will report on file 'goo' And if
'goo' doesn't exist, os.stat will complain.


I don't have access to a Windows machine to test this, but I suspect that
you have found a side-effect of a Windows bug.

http://answers.microsoft.com/en-us/...iod-to-a/4329b1f1-746e-4c45-9c32-75622b6ab526

http://support.microsoft.com/kb/115827
 
R

ruck

I'm unable to rename any file to have a '...' suffix, are you certain

the file exists in the form you think after the rename?

I see your point. Using cygwin bash, I have no problem naming files with '....' suffix. But I see you're right, it seems I cannot do so from Windows Explorer or from cmd shell.
FWIW, Windows Explorer displays to me that the file is named with '...' suffix.
John
 
I

Ian Kelly

(This with Python 2.7.2 on Windows 7)

os.stat() won't recognize a filename ending in period.
It will ignore trailing periods.
If you ask it about file 'goo...' it will report on file 'goo'
And if 'goo' doesn't exist, os.stat will complain.

Due to the weirdness of Windows filename extensions, these names refer
to the same file.

C:\Users\Ian>echo hello > goo

C:\Users\Ian>type goo
hello

C:\Users\Ian>type goo.
hello

C:\Users\Ian>type goo..
hello

C:\Users\Ian>type goo...
hello

C:\Users\Ian>echo world > goo...

C:\Users\Ian>dir goo*
Volume in drive C is OS
Volume Serial Number is 9881-66F0

Directory of C:\Users\Ian

09/06/2012 09:10 PM 8 goo
1 File(s) 8 bytes
0 Dir(s) 8,884,142,080 bytes free

C:\Users\Ian>type goo
world
 
R

ruck

(This with Python 2.7.2 on Windows 7)

os.stat() won't recognize a filename ending in period.
It will ignore trailing periods.
If you ask it about file 'goo...' it will report on file 'goo'
And if 'goo' doesn't exist, os.stat will complain.

create file goo, then

nt.stat_result(st_mode=33206, st_ino=0L, st_dev=0, st_nlink=0, st_uid=0, st_gid=0, st_size=0L, st_atime=1346978160L, st_mtime=1346978160L, st_ctime=1346978160L)

nt.stat_result(st_mode=33206, st_ino=0L, st_dev=0, st_nlink=0, st_uid=0, st_gid=0, st_size=0L, st_atime=1346978160L, st_mtime=1346978160L, st_ctime=1346978160L)

rename goo to "goo...", then,


Traceback (most recent call last):
File "<pyshell#16>", line 1, in <module>
os.stat('goo...')

WindowsError: [Error 2] The system cannot find the file specified: 'goo...'
Puzzling, to me at least.
Any comments?



Windows have restrictions on filenames. The restrictions are not

consistent in that some parts of Windows will let you make names that

other parts do not recognize or regard as illegal. I ran into this some

years ago and there may be a discussion on the tracker, but I have

forgetten the details except that one of the 'parts' was Windows

Explorer. This *might* be what you are running into.

Summary:
I was complaining that
Traceback (most recent call last):
File "<pyshell#35>", line 1, in <module>
os.stat('goo...')
WindowsError: [Error 2] The system cannot find the file specified: 'goo...'

is actually looking for file 'goo' instead of the existing file 'goo...' -- that's why it errors.
(Python 2.7.2, Windows 7)

Here's a workaround.nt.stat_result(st_mode=33206, st_ino=0L, st_dev=0, st_nlink=0, st_uid=0,
st_gid=0, st_size=0L, st_atime=1346978160L, st_mtime=1346978160L,
st_ctime=1346978160L)

In other words, prefix the path (full path?) with \\?\ to disable the Windows API filename interceptions.

Detail:
"Naming Files, Paths, and Namespaces" ( http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx )
says

Naming Conventions
The following fundamental rules enable applications to
create and process valid names for files and directories,
regardless of the file system:

* Do not end a file or directory name with a space or a
period. Although the underlying file system may support
such names, the Windows shell and user interface does not.

In my case, the filesystem is NTFS and it does support filenames like 'goo...', and I'm not trying to use Windows shell or UI. So how do I get to the underlying filesystem without interference? Here (from the same reference)

Namespaces
There are two main categories of namespace conventions
used in the Windows APIs, commonly referred to as NT
namespaces and the Win32 namespaces. ...

Win32 File Namespaces
The Win32 namespace prefixing and conventions are
summarized in this section and the following section,
with descriptions of how they are used. Note that these
examples are intended for use with the Windows API
functions and do not all necessarily work with Windows
shell applications such as Windows Explorer. For this
reason there is a wider range of possible paths than is
usually available from Windows shell applications, and
Windows applications that take advantage of this can be
developed using these namespace conventions.

For file I/O, the "\\?\" prefix to a path string tells
the Windows APIs to disable all string parsing and to
send the string that follows it straight to the file
system. For example, if the file system supports large
paths and file names, you can exceed the MAX_PATH limits
that are otherwise enforced by the Windows APIs.

Thanks all for your comments and pointers.
John
 
R

ruck

(This with Python 2.7.2 on Windows 7)

os.stat() won't recognize a filename ending in period.
It will ignore trailing periods.
If you ask it about file 'goo...' it will report on file 'goo'
And if 'goo' doesn't exist, os.stat will complain.

create file goo, then

nt.stat_result(st_mode=33206, st_ino=0L, st_dev=0, st_nlink=0, st_uid=0, st_gid=0, st_size=0L, st_atime=1346978160L, st_mtime=1346978160L, st_ctime=1346978160L)

nt.stat_result(st_mode=33206, st_ino=0L, st_dev=0, st_nlink=0, st_uid=0, st_gid=0, st_size=0L, st_atime=1346978160L, st_mtime=1346978160L, st_ctime=1346978160L)

rename goo to "goo...", then,


Traceback (most recent call last):
File "<pyshell#16>", line 1, in <module>
os.stat('goo...')

WindowsError: [Error 2] The system cannot find the file specified: 'goo...'
Puzzling, to me at least.
Any comments?



Windows have restrictions on filenames. The restrictions are not

consistent in that some parts of Windows will let you make names that

other parts do not recognize or regard as illegal. I ran into this some

years ago and there may be a discussion on the tracker, but I have

forgetten the details except that one of the 'parts' was Windows

Explorer. This *might* be what you are running into.

Summary:
I was complaining that
Traceback (most recent call last):
File "<pyshell#35>", line 1, in <module>
os.stat('goo...')
WindowsError: [Error 2] The system cannot find the file specified: 'goo...'

is actually looking for file 'goo' instead of the existing file 'goo...' -- that's why it errors.
(Python 2.7.2, Windows 7)

Here's a workaround.nt.stat_result(st_mode=33206, st_ino=0L, st_dev=0, st_nlink=0, st_uid=0,
st_gid=0, st_size=0L, st_atime=1346978160L, st_mtime=1346978160L,
st_ctime=1346978160L)

In other words, prefix the path (full path?) with \\?\ to disable the Windows API filename interceptions.

Detail:
"Naming Files, Paths, and Namespaces" ( http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx )
says

Naming Conventions
The following fundamental rules enable applications to
create and process valid names for files and directories,
regardless of the file system:

* Do not end a file or directory name with a space or a
period. Although the underlying file system may support
such names, the Windows shell and user interface does not.

In my case, the filesystem is NTFS and it does support filenames like 'goo...', and I'm not trying to use Windows shell or UI. So how do I get to the underlying filesystem without interference? Here (from the same reference)

Namespaces
There are two main categories of namespace conventions
used in the Windows APIs, commonly referred to as NT
namespaces and the Win32 namespaces. ...

Win32 File Namespaces
The Win32 namespace prefixing and conventions are
summarized in this section and the following section,
with descriptions of how they are used. Note that these
examples are intended for use with the Windows API
functions and do not all necessarily work with Windows
shell applications such as Windows Explorer. For this
reason there is a wider range of possible paths than is
usually available from Windows shell applications, and
Windows applications that take advantage of this can be
developed using these namespace conventions.

For file I/O, the "\\?\" prefix to a path string tells
the Windows APIs to disable all string parsing and to
send the string that follows it straight to the file
system. For example, if the file system supports large
paths and file names, you can exceed the MAX_PATH limits
that are otherwise enforced by the Windows APIs.

Thanks all for your comments and pointers.
John
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,965
Messages
2,570,148
Members
46,710
Latest member
FredricRen

Latest Threads

Top