2011-06-16 27 views
26

是否可以解除從c#程序中從互聯網上下載的文件的阻止? 瀏覽互聯網我瞭解到,信息是以包含當前區域信息(值3來自互聯網並被解釋爲阻止的)的(NTFS)文件的替代流寫入的。從.net 4中解除阻止文件4 c#

是否有管理可能性來清除或更改文件的區域信息(解除阻止)或是否存在管理複製功能來複制沒有區域信息的文件? 如果沒有,我怎樣才能用PInvoke但不包括外部程序集(我不允許在當前項目中這樣做)。

+2

@Sven:感謝:我想,我有完全是寫在我的問題。我的英語很糟糕嗎?但是,無論如何...... :) – HCL 2011-06-16 15:49:33

+0

不,不過,顯然我的閱讀技巧是。 :)在我的防守中,這是在午夜之後。 Fwiw,您將不得不使用PInvoke,因爲.Net System.IO類不支持備用數據流。 – Sven 2011-06-16 15:50:56

+0

查看http://stackoverflow.com/questions/604960/ntfs-alternate-data-streams-net – stuartd 2011-06-16 15:55:26

回答

15

它存儲在:Zone.Identifier流(more < c:\theapp.exe:Zone.Identifier)您需要使用本機IO例程來操縱它們,這裏是managed wrapper

+2

雖然這可能暫時有效,但它是一個實現細節。正如@citizenmatt所述,[持久區域標識符對象](https://msdn.microsoft.com/en-us/library/ms537029(v = vs.85).aspx)是負責創建這些對象的位。因此,MS可隨時通過Windows更新或操作系統版本更改數據的存儲方式/位置。 – 2015-07-27 22:59:50

28

根據你輸入我做了下面的代碼:

public class FileUnblocker { 
    [DllImport("kernel32", CharSet = CharSet.Unicode, SetLastError = true)] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    private static extern bool DeleteFile(string name); 

    public bool Unblock(string fileName) { 
     return DeleteFile(fileName + ":Zone.Identifier"); 
    } 
} 

感謝司徒凱爾德,亞歷克斯·K(+1)和斯文給我方向。

UPDATE 我已經發布的代碼here的反饋是否會工作在生產環境中可靠。如果有人想使用它,請在那裏查看。

+1

這樣的更新應作爲編輯發佈到您的問題。 – 2015-07-27 22:56:37