2013-10-04 43 views
2

我正在研究一個在Windows 8.1機器上安裝802.1x證書的python腳本。這個腳本在Windows 8和Windows XP上工作正常(在其他機器上沒有嘗試過)。os.listdir看不到我的目錄

我已經隔離了這個問題。它與清理出的文件夾

"C:\Windows\system32\config\systemprofile\AppData\LocalLow\Microsoft\CryptURLCache\Content" 

的問題是,我使用這個文件夾的模塊OS和命令listdir同時刪除的每個文件在做的事。但是,listdir錯誤,說該文件夾不存在,當它確實存在。

問題似乎是os.listdir看不到LocalLow文件夾。如果我做一個兩行腳本:

import os 

os.listdir("C:\Windows\System32\config\systemprofile\AppData") 

它顯示了以下結果:

['Local', 'Roaming'] 

正如你所看到的,LocalLow丟失。

我認爲這可能是一個權限問題,但我很難找出下一步可能是什麼。我從命令行以管理員身份運行該進程,並且它根本看不到該文件夾​​。

在此先感謝!更改字符串爲r「C:\ Windows \ System32 \ config \ systemprofile \ AppData」,「C:\ Windows \ System32 \ config \ systemprofile \ AppData」或C:\ Windows \ System32 \ config/systemprofile/AppData「全部產生相同的結果

編輯:在這個問題上的另一個不尋常的皺紋:如果我手動在該位置創建一個新的目錄,我無法通過os.listdir看到它另外,我無法瀏覽到LocalLow或我的新文件夾通過「另存爲...」在記事本++

命令我開始認爲這是Windows 8.1預覽中的錯誤。

+2

你說。 「......當它確實存在」,但你展示的證據似乎表明它沒有。你爲什麼認爲它確實存在? – twalberg

+0

如果你啓動了cmd或powershell並嘗試列出AppData目錄的內容,你會看到「LocalLow」嗎?另外,也許你做'os.walk(directory)'看看你是否得到了相同的結果? –

+0

是的,兩個ls和簡單地瀏覽到文件夾讓我看到它就好。我也可以從cmd提示符進入它。 –

回答

3

您的路徑中必須有轉義序列。您應該使用文件/目錄路徑的原始字符串:

# By putting the 'r' at the start, I make this string a raw string 
# Raw strings do not process escape sequences 
r"C:\path\to\file" 

或將斜線的其他方式:

"C:/path/to/file" 

或逃避斜線:

# You probably won't want this method because it makes your paths huge 
# I just listed it because it *does* work 
"C:\\path\\to\\file" 
+1

另一種選擇是在路徑中使用雙反斜槓(即'\\'而不是'\') –

+2

@JeffBridgman - 當您評論時,我只是在輸入該值。 :) – iCodez

+0

感謝您的快速響應!但是,所有這三個選項都會產生與我原始腳本 –

1

我很好奇至於你如何能夠用這兩行來列出內容。您在代碼中使用轉義序列\ W,\ S,\ c,\ s,\ A.嘗試轉義斜槓像這樣:

import os 
os.listdir('C:\\Windows\\System32\\config\\systemprofile\\AppData') 
+0

我不確定爲什麼這些不被解釋爲轉義序列,但上面提出的所有三個建議,以及原來的代碼工作完全一樣 –

2

我最近遇到這個問題。

我發現它是由Windows file system redirector

造成的,你可以看看下面的Python代碼片段

import ctypes 

class disable_file_system_redirection: 
    _disable = ctypes.windll.kernel32.Wow64DisableWow64FsRedirection 
    _revert = ctypes.windll.kernel32.Wow64RevertWow64FsRedirection 
    def __enter__(self): 
     self.old_value = ctypes.c_long() 
     self.success = self._disable(ctypes.byref(self.old_value)) 
    def __exit__(self, type, value, traceback): 
     if self.success: 
      self._revert(self.old_value) 


#Example usage 
import os 

path = 'C:\\Windows\\System32\\config\\systemprofile\\AppData' 

print os.listdir(path) 
with disable_file_system_redirection(): 
    print os.listdir(path) 
print os.listdir(path) 

裁判:http://code.activestate.com/recipes/578035-disable-file-system-redirector/

+0

嘿,謝謝你的答案。這看起來不錯,但不幸的是,我不再是在使用python的工作,所以我不能確認這是有效的。如果有人能證實它,我會很高興將它標記爲答案。 –

+0

@JasonBray爲我工作,但如果你正在運行python 3.x +,你需要'print(os.listdir(path))'而不是'print os.listdir(path)'' –

相關問題