2013-09-16 81 views
1

有什麼辦法使文件和其他文件關聯是指當任何一個試圖複製任何這些文件,所有相關文件也複製。文件關聯

像OS保護時,任何相關的文件被複制被複制隱藏文件。有沒有辦法在c#或其他工作中做到這一點?

好的,我的問題來縮小。我要爲特定類型的文件實現自定義圖標疊加。我已經通過在包含圖標可以覆蓋的文件的名稱的目錄中使用隱藏文件來實現此目的。但我的問題是,當任何文件的路徑被寫入該隱藏文件被移動,覆蓋圖標被設置爲默認。可能是下面給出的代碼片段將有助於清除我的問題。

[ComVisible(false)] 
[Guid("1fd5bae8-257a-461a-91ea-869a810e0ccc")] 
public class MyIconOverlayHandlersBase : IShellIconOverlayIdentifier 
{ 
    string fileName = string.Empty; 

    #region Class Properties 

    protected virtual string OverlayIconFilePath 
    { 
     get 
     { 
      return string.Empty; 
     } 
    } 

    protected virtual string TargetDirectory 
    { 
     get 
     { 
      return string.Empty; 
     } 
    } 

    protected virtual int Priority 
    { 
     get 
     { 
      return 0; // 0-100 (0 is highest priority) 
     } 
    } 

    protected virtual string FileNameStart 
    { 
     get 
     { 
      return fileName; 
     } 

     set 
     { 
      fileName = value; 
     } 
    } 

    #endregion Class Properties 

    #region IShellIconOverlayIdentifier Members 

    public int IsMemberOf(string path, uint attributes) 
    { 
     List<string> filesName = IsHiddenVDFile(path); 

     if (filesName.Count <= 0) 
     { 
      return (int)HRESULT.S_FALSE; 
     } 

     try 
     { 
      string f = Path.GetFileName(path); 
      string newFile = filesName.FirstOrDefault(t => t.Equals(f)); 
      if (!String.IsNullOrEmpty(newFile)) 
      { 
       unchecked 
       { 
        return 
         Path.GetFileName(path).StartsWith(newFile, StringComparison.InvariantCultureIgnoreCase) ? 
         (int)HRESULT.S_OK : 
         (int)HRESULT.S_FALSE; 
       } 
      } 
      else 
      { 
       return (int)HRESULT.S_FALSE; 
      } 
     } 
     catch 
     { 
      unchecked 
      { 
       return (int)HRESULT.E_FAIL; 
      } 
     } 
    } 

    private List<string> GetFilesName(string info) 
    { 
     List<string> files = new List<string>(); 
     StreamReader reader = new StreamReader(info); 
     string fileNames = reader.ReadToEnd(); 
     string[] f = fileNames.Split('\r'); 
     foreach (string file in f) 
     { 
      files.Add(file.Trim()); 
     } 
     reader.Close(); 
     return files; 
    } 

    private List<string> IsHiddenVDFile(string path) 
    { 
     DirectoryInfo info = new DirectoryInfo(path).Parent; 
     if (info == null) 
     { 
      return new List<string>(); 
     } 
     FileInfo[] files = info.GetFiles(); 

     var filtered = files.Select(f => f).Where(f => (f.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden); 

     foreach (var f in filtered) 
     { 
      if (f.Name.Equals("01AVDNames.txt")) 
      { 
       return GetFilesName(f.FullName); 
      } 
     } 
     return new List<string>(); 
    } 

    public int GetOverlayInfo(IntPtr iconFileBuffer, int iconFileBufferSize, out int iconIndex, out uint flags) 
    { 
     string fname = OverlayIconFilePath; 
     int bytesCount = System.Text.Encoding.Unicode.GetByteCount(fname); 
     byte[] bytes = System.Text.Encoding.Unicode.GetBytes(fname); 
     if (bytes.Length + 2 < iconFileBufferSize) 
     { 
      for (int i = 0; i < bytes.Length; i++) 
      { 
       Marshal.WriteByte(iconFileBuffer, i, bytes[i]); 
      } 
      //write the "\0\0" 
      Marshal.WriteByte(iconFileBuffer, bytes.Length, 0); 
      Marshal.WriteByte(iconFileBuffer, bytes.Length + 1, 0); 
     } 

     iconIndex = 0; 
     flags = (int)(HFLAGS.ISIOI_ICONFILE | HFLAGS.ISIOI_ICONINDEX); 
     return (int)HRESULT.S_OK; 
    } 

    public int GetPriority(out int priority) 
    { 
     priority = Priority; 
     return (int)HRESULT.S_OK; 
    } 
+2

你能告訴我們你想要完成的更多細節嗎? – meilke

+0

除了運行一個可以查找指定目錄中的文件的常量腳本,並且當它找不到它時,它會移動其他文件 - 我看不到其他方式。要麼這個方法超出了我的知識。 –

+3

你指的是什麼「操作系統保護隱藏文件」?我知道沒有這樣的行爲。 –

回答

1

您可以使用FileSystemWatcher趕上被複制的文件,然後複製你想用它的任何文件。

+0

是,雖然FileSystemWatcher的不是沒有它的問題:http://stackoverflow.com/questions/239988/filesystemwatcher-vs-polling-to-watch-for-file-changes – Arran

+0

什麼如果我有多個目錄中的多個關聯文件。 –

+1

你也有這個問題,你的代碼必須在任何時候運行這個工作,這是很難保證... –