1

すべてのシンボリック リンクが 1 つの大きなフラット フォルダーに配置される、ネストされたディレクトリ構造内の各ファイルのシンボリック リンクを作成し、今では次のコードを作成したいと考えています。

# loop over directory structure:
# for all items in current directory,
# if item is directory, recurse into it;
# else it's a file, then create a symlink for it
def makelinks(folder, targetfolder, cmdprocess = None):
    if not cmdprocess:
        cmdprocess = subprocess.Popen("cmd",
                                  stdin  = subprocess.PIPE,
                                  stdout = subprocess.PIPE,
                                  stderr = subprocess.PIPE)
    print(folder)
    for name in os.listdir(folder):
        fullname = os.path.join(folder, name)
        if os.path.isdir(fullname):
            makelinks(fullname, targetfolder, cmdprocess)
        else:
            makelink(fullname, targetfolder, cmdprocess)

#for a given file, create one symlink in the target folder
def makelink(fullname, targetfolder, cmdprocess):
    linkname = os.path.join(targetfolder, re.sub(r"[\/\\\:\*\?\"\<\>\|]", "-", fullname))
    if not os.path.exists(linkname):
        try:
            os.remove(linkname)
            print("Invalid symlink removed:", linkname)
        except: pass
    if not os.path.exists(linkname):
        cmdprocess.stdin.write("mklink " + linkname + " " + fullname + "\r\n")

したがって、これはトップダウンの再帰であり、最初にフォルダー名が出力され、次にサブディレクトリが処理されます。これをいくつかのフォルダーで実行すると、10個ほどのシンボリックリンクの後で全体が停止します。

プログラムはまだ実行されているようですが、新しい出力は生成されません。# tag & reencodeフォルダ内のいくつかのファイルと、フォルダ内の最初の 3 つのファイルに対して 9 つのシンボリック リンクが作成されましたChillOutMix。cmd.exe ウィンドウはまだ開いていて空で、タイトル バーに、現在 の 3 番目のファイルの mklink コマンドを処理中であることが示されていますChillOutMix

time.sleep(2)Pythonがcmdプロセスに対して速すぎる場合に備えて、それぞれの後に挿入しようとしましたcmdprocess.stdin.writeが、役に立ちません。

問題が何であるかを知っている人はいますか?

4

2 に答える 2

0

mklinkを直接実行してみませんか?

于 2011-03-10T00:08:25.307 に答える
0

最後にこれを試してください:

if not os.path.exists(linkname):
    fullcmd = "mklink " + linkname + " " + fullname + "\r\n"
    print fullcmd
    cmdprocess.stdin.write(fullcmd)

それが出力するコマンドを確認してください。問題が発生する場合があります。

mklinkスペースが含まれることがあるため、 の arg を二重引用符で囲む必要がある場合があります。

于 2011-03-10T00:19:59.390 に答える