2011-12-23 9 views
24

Mam ukryty plik na wymiennej pamięci masowej USB (system plików FAT).Jak ustawić czysty atrybut "X" dla plików z C#?

Używam systemu Windows 7. Jeśli przejdę do okna Właściwości tego pliku, a następnie do karty Szczegóły, zobaczę, że atrybutami pliku są HX. Kiedy uruchamiam cmd i używać attrib, powiedziano mi, że plik ma atrybut H. nic o X. próbowałem help attrib, ale nadal nic o atrybucie X.

wiem, że:

  • H = ukryte
  • S = system
  • A = archiwalne
  • R = Readonly

Jednak nie mam pojęcia, co oznacza X. Znalazłem także to, do czego służą N and E attributes.

Wikipedia nie wspomina o tym, czym jest atrybut X.

Google znaleźć dwa tematy wspomnieć atrybut X:

Żaden z nich nie pomógł.

Chciałbym móc odczytać/zapisać tę flagę w języku C#, ale do tej pory czytałem dokumentację dla FileAttributes enumeration i eksperymentowałem z ustawianiem niektórych wymienionych atrybutów (przy użyciu metod File.GetAttributes & File.SetAttributes) w pliku.

Żaden z tych eksperymentów nie spowodował pojawienia się atrybutu X we właściwościach -> Szczegóły. Nie mam pojęcia, jak do tego podejść, zwłaszcza, że ​​wciąż nie wiem, co oznacza atrybut X.

Czym jest atrybut X i jak można go ustawić/wyczyścić na wybranym pliku w C#?

+0

Wygląda na to, że wszystkie komentarze zostały zgubione - Zostałem zapytany, czy atrybut X zniknie po wykonaniu 'chkdsk' Nie, zrobiłem' chkdsk' - nie znaleziono żadnych problemów, a atrybut X jest nadal mi. – beam022

+2

Zgaduję, że celowo nieważny atrybut pliku. W FAT32, 0x40 i 0x80 istnieją dwa nieprzypisane bity. To tylko domysły. –

+2

Podejrzewam, że Hans ma rację. Pobierz atrybuty pliku, wyrzuć je do 'int' i wyprowadź na hex. Następnie porównaj ustawione bity do stałych atrybutów pliku: http://msdn.microsoft.com/en-us/library/windows/desktop/gg258117(v=vs.85).aspx. To powinno Ci powiedzieć, który bit jest nieprawidłowo ustawiony. Jeśli chcesz wyczyścić atrybut, wyczyść go w tym int, odrzuć int z powrotem do 'FileAttributes' i wywołaj' File.SetAttributes'. –

Odpowiedz

1

Może się mylę, ale ... Myślę, że atrybut X oznacza, że ​​plik ma numer extended attributes. Niestety rozszerzonych atrybutów nie można modyfikować przy użyciu C#.

+0

Myślę, że masz rację co do rozszerzonych atrybutów. Wiem, że 'FILE_ATTRIBUTE_DEVICE 0x40' nie może być ustawione przy użyciu [' SetFileAttribute'] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa365535%28v=vs.85%29. aspx), ale być może istnieje inna metoda ustawienia lub wyczyszczenia tego atrybutu za pomocą C#. Czytałem o "EA DATA". SF', ale wydaje mi się, że mam dużo więcej do zrobienia. Każdy pomysł, jak uzyskać dostęp i edytować "EA DATA". Plik SF' z C#? [Implementacja EA na FAT] (http://ps-2.kev009.com:8081/tavi/os2pages/eadata.html), [EA - co i jak] (http://www.howzatt.demon.co .uk/articles/06may93.html) – beam022

+0

Wypróbowałem kilka dostępnych narzędzi do usuwania plików, ale żadna z nich nie pomogła pozbyć się tego pliku. Jeśli chodzi o 'EA DATA. SF', nie jestem pewien, czy ten plik EA znajduje się na moim dysku flash USB. ** Jak sprawdzić, czy to istnieje **? Mówi się [tutaj] (http://www.cygwin.com/1.5/cygwin-ug-net/using-filemodes.html), że 'EA DATA. Plik SF' _ można usunąć tylko poza Windows z powodu jego statusu "w użyciu". Czy to naprawdę jest przypadek? A jeśli nie mogę usunąć pliku z attr X, z powodu 'EA DATA. SF', którego również nie mogę usunąć z powodu wygranej7 ... Jak mogę ** tworzyć własne "EA DATA". SF' ** po sformatowaniu pamięci flash? – beam022

+0

Powód, dla którego zapytałem, jak sprawdzić "EA DATA". Plik SF istniał, ponieważ nie pojawił się w eksploratorze (ustawiłem wyświetlanie ukrytych i systemowych plików). Próbowałem "jeśli istnieje" EA DATA. SF "echo To jest tutaj!' W 'cmd', ale nie dostałem potwierdzenia. Wygląda na to, że to nie jest EA DATA. Plik SF', który sprawia, że ​​drugi plik jest nietykalny. Mogę się mylić, doceniłbym pomoc. – beam022

0

X jest najprawdopodobniej uprawnieniami do wykonywania. icalcs wspomina o tym i możesz użyć tego polecenia z C# do ustawienia atrybutu pliku, chociaż nie jestem pewien, czy będzie działać przeciwko systemowi plików FAT, czy nie.

+0

Nie sądzę, że atrybut "wykonaj" dotyczy systemu plików systemu Windows, takiego jak FAT. – CedX

+0

Czytałem o 'icacls', próbowałem użyć go w danym pliku, dostałem" Acces denied ". Następnie trochę eksperymentowałem z 'icacls' na innych plikach na pendrive'ie, ale nie zaszło to zbyt daleko: kiedy wpisałem' manekin icacls', wszystko, co otrzymuję, to 'dummy D: NO_ACCESS_CONTROL'. Nie mogłem dokonać żadnych zmian w ACL manekina, mimo że spróbowałem '/ grant','/deny' i '/ remove'. Następnie przeszukałem i stwierdziłem, że "najpierw aklimy są obsługiwane przez system plików NTFS" zgodnie z [postem andreas2610] (http://social.technet.microsoft.com/Forums/en-US/w7itprosecurity/thread/9e84667f-6eef -4f00-9a75-7c6d1d89a89b /) – beam022

1

Niestety, interfejs API systemu Windows uniemożliwi ci ustawienie/rozbrojenie pliku FILE_ATTRIBUTE_DEVICE, ponieważ nie ma on być ustawiony na pliki. Jeśli naprawdę potrzebujesz takiej możliwości, będziesz musiał uzyskać bezpośredni dostęp do dysku. Naprawdę nie polecam próbowania tego w C#.

Najszybszą możliwą implementacją byłoby prawdopodobnie zapomnienie o zrobieniu tego w systemie Windows, pobranie źródła dla mtools i wykonanie kilku edycji do źródła matrib, aby to działało.

np dodać do msdos.h:

#define ATTR_DEVICE 0x40 
#define IS_DEVICE(entry) (HAS_BIT((entry),ATTR_DEVICE)) 

Następnie dodać kod do mattr.c więc można ustawić atrybut i weryfikacji zmiany:

static int view_attrib(direntry_t *entry, MainParam_t *mp) 
{ 
    ... 
    /* Add this if block */ 
    if(IS_DEVICE(entry)) 
     putchar('X'); 
    ... 
} 


static int concise_view_attrib(direntry_t *entry, MainParam_t *mp) 
{ 
    ... 
    /* Add the following if block */ 
    if(IS_DEVICE(entry)) 
     putchar('X'); 
    ... 
} 

static int letterToCode(int letter) 
{ 
    switch (toupper(letter)) { 
     ... 
     /* Add the following case */ 
    case 'X': 
     return ATTR_DEVICE; 
     ... 
    } 
} 

Wtedy po prostu trzeba skonfiguruj dysk na mtools i wywołaj nowo utworzone polecenie mattrib -x na pliku, który chcesz zmienić.

+0

Dziękuję za odpowiedź, ale muszę to zrobić w systemie Windows. – beam022

+0

Ah. Oczywiście, możesz być w stanie uzyskać ten kod działający pod Cygwin, jeśli nadal tkwisz w martwym punkcie. –

0

I nie można odtworzyć problemu, ale jako obejście usunąć ten atrybut Myślę, że można spróbować z robocopy:

robocopy xattributefile copyoffile /copy:DT 

/copy:DT: Określa właściwości plików do skopiowania.

Ten atrybut nie powinien kopiować ale nie wiem czy to działa z atrybutem X)

1

atrybut pliku X correspondes do System.IO.FileAttributes.Device który ma wartość całkowitą 64 (0x40) przy użyciu .NET nie można bezpośrednio ustawić to wartość. Problemem jest to, że podczas rozmowy File.SetAttributes(path, fileAttributes) wywołuje wewnętrzny funkcja import DLL w Mscorlib.dll, mianowicie metoda statyczna Microsoft.Win32.Win32Native.SetFileAttributes, jest to bezpośredni import dll z kernel32.dll i jest zdefiniowany jako:

// Microsoft.Win32.Win32Native 
[DllImport("kernel32.dll", BestFitMapping = false, CharSet = CharSet.Auto, SetLastError = true)] 
internal static extern bool SetFileAttributes(string name, int attr); 

Więc Mówiąc prościej, nawet przy użyciu kernel32.dll nie można ustawić tej wartości. Zobacz: SetFileAttributes i System.IO.FileAttributes.

Ale możesz napisać kod, który będzie skutecznie robił to samo, co ustawienie lub usunięcie tego atrybutu.

najlepiej i prawdopodobnie tylko (rozsądny) odpowiedzią byłoby zachować plik szablonu z pozwoleniem X, gdy trzeba ustawić plik mieć X zmienić nazwę istniejącego pliku, skopiuj plik szablonu X a następnie napisać inne atrybuty.

Do usuwania pozwolenie X należy przeczytać plik i zapisać do nowego pliku i skopiuj tam uprawnienia za pomocą prostego połączenia do File.SetAttributes(path, File.GetAttributes(oldPath)); (który nie będzie ustawić uprawnienie X.

Takie podejście jest bardzo prosta do przodu i byłoby to całkowicie możliwe w natywnym .NET (i nie wyglądałoby to zbyt paskudnie, w porównaniu do hackowania na poziomie dysku lub wywoływania cgywina - gdyby to działało)

Powiązane problemy