2011-12-23 19 views
24

Ho un file nascosto nella memoria rimovibile USB (file system FAT).Come impostare l'attributo "X" chiaro su file con in C#?

Sto usando Windows 7. Se vado alla finestra Proprietà di questo file e poi alla scheda Dettagli, vedrò che gli attributi del file sono HX. Quando eseguo cmd e utilizzare attrib, mi hanno detto che il file ha attributo H. Niente X. Ho provato help attrib, ma ancora nulla di attributo X.

So che:

  • H = nascosti
  • S = sistema
  • A = archivio
  • R = Readonly

Tuttavia, non ho idea di cosa X significhi. Ho anche trovato quello che sono gli N and E attributes.

Wikipedia non ha menzione di quale sia l'attributo X.

Google ha trovato due argomenti di nota attributo X:

Nessuno di questi ha aiutato.

mi piacerebbe essere in grado di leggere/scrivere questo flag in C#, ma finora ho letto la documentazione per il FileAttributes enumeration e sperimentato con l'impostazione alcuni degli attributi elencati (usando metodi File.GetAttributes & File.SetAttributes) sul file.

Nessuno di questi esperimenti ha comportato la visualizzazione dell'attributo X in Proprietà -> Dettagli. Quindi, non ho idea di come affrontarlo, soprattutto perché non so ancora quale sia l'attributo X.

Quindi, qual è l'attributo X e come è possibile impostarlo/cancellarlo sul file selezionato in C#?

+0

Sembra che tutti i commenti siano andati persi - Mi è stato chiesto se l'attributo X sarebbe scomparso dopo aver eseguito 'chkdsk'. No, ho fatto il' chkdsk' - non sono stati trovati problemi e l'attributo X è ancora lì e. – beam022

+2

Indovino a un attributo file intenzionalmente non valido. Ci sono due bit non assegnati in FAT32, 0x40 e 0x80. Questa è solo una supposizione. –

+2

Sospetto che Hans abbia ragione. Ottieni gli attributi del file, gettalo su 'int' e stampalo in esadecimale. Quindi confronta i bit impostati con Costanti attributo file: http://msdn.microsoft.com/en-us/library/windows/desktop/gg258117(v=vs.85).aspx. Questo dovrebbe dirti quale bit è impostato in modo errato. Se si desidera cancellare l'attributo, cancellarlo in int, eseguire il cast di int a 'FileAttributes' e chiamare' File.SetAttributes'. –

risposta

1

Forse ho sbagliato ma ... Penso che l'attributo X significhi che il file ha extended attributes. Sfortunatamente, gli attributi estesi non possono essere modificati usando C#.

+0

Penso che potresti avere ragione sugli attributi estesi. Ora so che 'FILE_ATTRIBUTE_DEVICE 0x40' non può essere impostato usando [' SetFileAttribute'] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa365535%28v=vs.85%29. aspx), ma forse c'è un altro metodo per impostare o cancellare questo attributo usando C#. Ho letto su 'EA DATA. SF', ma sembra che io abbia molto più da leggere. Qualche idea su come accedere e modificare 'EA DATA. File SF' da C#? [Implementazione di EA su FAT] (http://ps-2.kev009.com:8081/tavi/os2pages/eadata.html), [EA: cosa e come] (http://www.howzatt.demon.co .uk/articles/06may93.html) – beam022

+0

Ho provato alcuni strumenti per la rimozione dei file disponibili, ma nessuno di questi ha aiutato a sbarazzarsi del file. Per quanto riguarda 'EA DATA. SF', non sono sicuro che questo file EA si trovi sulla mia chiavetta USB flash. ** Come può verificare la sua esistenza **? Si dice [qui] (http://www.cygwin.com/1.5/cygwin-ug-net/using-filemodes.html) che 'EA DATA. SF' _file può essere cancellato solo fuori da Windows a causa del suo stato "in uso". È davvero un caso? E se non riesco a rimuovere il file con attr X, a causa di 'EA DATA. SF', che non posso rimuovere a causa di win7 ... Come posso ** creare il mio 'EA DATA. SF' ** dopo aver formattato l'unità flash? – beam022

+0

La ragione per cui ho chiesto come verificare la presenza di 'EA DATA. L'esistenza del file SF' era perché non si mostra in explorer (ho impostato i file nascosti e di sistema su). Ho provato "se esiste" EA DATA. SF "echo È qui!" In 'cmd', ma non ho avuto conferma. Sembra che non sia 'EA DATA. File SF' che rende l'altro file intoccabile. Potrei sbagliarmi, apprezzerei l'aiuto. – beam022

0

La X è molto probabilmente le autorizzazioni di esecuzione. icalcs lo menziona ed è possibile utilizzare questo comando da C# per impostare un attributo file, anche se non sono sicuro che funzionerà contro un filesystem FAT o meno.

+0

Non penso che l'attributo "execute" si applica a un file system Windows come FAT. – CedX

+0

Ho letto su 'icacls', ho provato ad usarlo su file in questione, ho ricevuto" Acces negato ". Poi ho sperimentato un po 'con 'icacls' su altri file sulla chiavetta USB, ma non ho fatto molta strada: quando ho digitato' icacls dummy' tutto quello che ottengo è 'dummy D: NO_ACCESS_CONTROL'. Non ho potuto apportare modifiche all'ACL di dummy, anche se ho provato '/ grant','/deny' e '/ remove'. Poi ho fatto alcune ricerche e ho scoperto che "gli acl sono prima supportati dal file system ntfs" secondo [post andreas2610] (http://social.technet.microsoft.com/Forums/en-US/w7itprosecurity/thread/9e84667f-6eef -4f00-9a75-7c6d1d89a89b /) – beam022

1

Sfortunatamente, l'API di Windows ti impedirà di impostare/disabilitare FILE_ATTRIBUTE_DEVICE perché non è pensato per essere impostato sui file. Se hai davvero bisogno di farlo, dovrai accedere direttamente al disco. Non consiglio davvero di provare a farlo in C#.

L'implementazione più rapida possibile è probabilmente quella di dimenticare di farlo in Windows, scaricare l'origine per mtools e apportare un paio di modifiche al sorgente mattrib per farlo funzionare.

esempio aggiungi al msdos.h:

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

quindi aggiungere il codice per mattr.c in modo da poter impostare l'attributo e verificare la modifica:

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; 
     ... 
    } 
} 

Poi si sarebbe solo dovuto imposta l'unità su mtools e chiama il comando mattrib -x appena creato sul file che desideri modificare.

+0

Grazie per la risposta, tuttavia ho bisogno di farlo in Windows. – beam022

+0

Ah. Ovviamente, potresti essere in grado di far funzionare questo codice sotto Cygwin se sei ancora bloccato. –

0

non riesco a riprodurre il problema, ma come soluzione per rimuovere l'attributo penso che si può provare con robocopy:

robocopy xattributefile copyoffile /copy:DT 

/copy:DT: Specifica le proprietà del file da copiare.

Questo non dovrebbe copiare attributo ma non so se funziona con l'attributo X)

1

File Attribute X correspondes a System.IO.FileAttributes.Device che ha un valore intero di 64 (0x40) utilizzando .NET non è possibile impostare direttamente questo valore. Il problema è che quando si chiama File.SetAttributes(path, fileAttributes) si chiama una funzione DLL di importazione interno Mscorlib.dll, vale a dire il metodo statico Microsoft.Win32.Win32Native.SetFileAttributes, si tratta di un'importazione dll diretta di kernel32.dll ed è definito come:

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

Quindi in parole povere, anche utilizzando kernel32.dll non è possibile impostare questo valore. Vedi: SetFileAttributes e System.IO.FileAttributes.

Tuttavia, è possibile scrivere codice che farà effettivamente lo stesso dell'impostazione o della rimozione di questo attributo.

del tuo meglio e probabilmente solo (ragionevole) risposta sarebbe quello di mantenere un file di modello con il permesso X, quando è necessario impostare un file per avere X si rinomina il file esistente, copiare il file del modello X e poi scrivere il altri attributi.

Per rimuovere il X autorizzazione si dovrebbe leggere il file e scrivere in un nuovo file e quindi copiare ci autorizzazioni utilizzando una semplice chiamata al File.SetAttributes(path, File.GetAttributes(oldPath)); (che non impostare l'autorizzazione X.

Questo approccio è piuttosto semplice in avanti e sarebbe del tutto possibile in .NET nativo (e in realtà non sarebbe nemmeno troppo brutto, rispetto all'hacking intorno al livello del disco o invocando cgywin - se anche funzionasse).