こんなところにこんな罠があるとは夢にも思わず、ガッツリやられたのでこれ以上不幸な人を生み出さないためにメモ。
Windows の NTFS で作るハードリンクは、一つのファイルに対して 1023 個が MAX のようです(!!)
恐ろしいことに、これ、日本語で書かれたドキュメントが見つからないんですね、、、みんなそこまで使ってないんでしょうか?
一番詳しく書かれているっぽいのが英語の Wikipedia。
The maximum number of hard links to a single file is limited by the size of the reference counter: with NTFS this is limited to 1023 because a 10 bit field is used for this purpose.
NTFSでは、ハードリンクを管理するための領域として 10bit しか確保してないから 1023 個しかリンクできないよ♪ってことらしいです。おおう、じーざす!!
本当かどうか、テストしてみました。
import os
import ctypes
def CreateHardLink(src, dest):
CreateHardLinkW = ctypes.windll.kernel32.CreateHardLinkW
CreateHardLinkW.argtypes = [ctypes.c_wchar_p, ctypes.c_wchar_p, ctypes.c_int]
ret = CreateHardLinkW(dest, src, 0)
if ret ==0:
print ctypes.FormatError()
print src
print dest
raise
return ret
src = r'c:\temp\src.txt'
if not os.path.exists(src):
open(src, 'w').close()
for i in range(2048):
print i
CreateHardLink(src, os.path.join(r'c:\temp', '%04d.txt' % i))
C:\temp>python testLink.py
0
1
2
3
4
5
6
7
8
9
10(中略)
1020
1021
1022
1023
ファイル システムでサポートされている以上の数のリンクをファイルに作成しようとしました。
c:\temp\src.txt
c:\temp\1023.txt
Traceback (most recent call last):
File “testLink.py”, line 24, in
CreateHardLink(src, os.path.join(r’c:\temp’, ‘%04d.txt’ % i))
File “testLink.py”, line 14, in CreateHardLink
raise
TypeError: exceptions must be old-style classes or derived from BaseException, not NoneTypeC:\temp>
本当でした。。。
ちなみに、この制限は NTFS によるものなので Linux ベースのファイルサーバーに対して同様なことをしてもエラーにならないみたいです。
私の環境(Windows7+QNAP)では、2048 個のリンクを張ることもできました。
Windows でハードリンクを張るっていうことがかなり少ないのでハマることはあまりないのかもしれませんが、こういうことが想定されるシステムではちゃんとした OS で動いているファイルサーバーを用意した方がいいかもしれません。