Du kan inte ta bort en fil eller mapp på en NTFS-filsystemvolym

Den här artikeln beskriver varför det inte går att ta bort en fil eller mapp på en NTFS-filsystemvolym. Det ger också hjälp med att lösa det här problemet.

Gäller för: Windows Server 2012 R2
Ursprungligt KB-nummer: 320081

Obs!

Internt behandlar NTFS mappar som en särskild typ av fil. Ordfilen i den här artikeln anger därför antingen en fil eller mapp.

Orsak 1: Filen använder en ACL

Du kan inte ta bort en fil om filen använder en Access Control List (ACL). Lös problemet genom att ändra behörigheterna för filen. Du kan behöva bli ägare till filerna för att ändra behörigheterna.

Administratörer har implicit möjlighet att bli ägare till alla filer, även om de inte uttryckligen har beviljats någon behörighet till filen. Filägare har implicit möjlighet att ändra filbehörigheter, även om de inte uttryckligen beviljas några behörigheter till filen. Därför kan du behöva bli ägare till en fil, ge dig själv behörighet att ta bort filen och sedan ta bort filen.

Du kan inte använda vissa säkerhetsverktyg för att visa eller ändra behörigheter eftersom filen har en icke-kanonisk ACL

Du kan lösa det här problemet genom att använda ett annat verktyg (till exempel en senare version av Cacls.exe).

Access Control poster (ACL) i en ACL har en viss önskad sekvens beroende på deras typ. Till exempel kommer ACL:er som nekar åtkomst vanligtvis före ACL:er som beviljar åtkomst. Ingenting hindrar dock ett program från att skriva en ACL som har åtkomstkontrollistor i valfri sekvens. I vissa tidigare versioner av Windows uppstod problem när Windows försökte läsa dessa icke-kanoniska ACL:er. Ibland kan du inte ändra dessa ACL:er korrekt med hjälp av Den grafiska säkerhetsredigeraren i Microsoft Windows Explorer. Det här problemet har korrigerats i senare versioner av Windows. Om det här problemet uppstår använder du den senaste versionen av Cacls.exe. Även om du inte kan visa eller redigera en ACL på plats kan du skriva en ny ACL för att få åtkomst till filen.

Orsak 2: Filen används

Du kan inte ta bort en fil om filen används. Lös problemet genom att fastställa vilken process som har det öppna handtaget och sedan stänga den processen.

Beroende på hur filen öppnas kanske du inte kan ta bort en fil som används. Filen är till exempel öppen för exklusiv åtkomst i stället för delad åtkomst. Du kan använda olika verktyg för att fastställa de processer som har öppna referenser till filer när du vill.

Symptomen på det här problemet kan variera. Du kan använda kommandot Ta bort för att ta bort en fil. Men filen tas inte bort förrän processen där filen är öppen släpper filen. Dessutom kanske du inte kan komma åt dialogrutan Säkerhet för en fil som väntar på att tas bort. Lös problemet genom att fastställa vilken process som har det öppna handtaget och sedan stänga den processen.

Orsak 3: Filsystemet skadas förhindrar åtkomst till filen

Du kan inte ta bort filen om filsystemet är skadat. Lös problemet genom att köra Chkdsk-verktyget på diskvolymen för att åtgärda eventuella fel.

Följande orsaker kan skada filsystemet och försätta filer i ett problematiskt tillstånd:

  • Dåliga sektorer på disken
  • Annan felaktig maskinvara
  • Programvarubuggar

Vanliga åtgärder kan misslyckas på olika sätt. När filsystemet upptäcker skador loggar det en händelse i händelseloggen och du får vanligtvis ett meddelande som uppmanar dig att köra Chkdsk. Beroende på vilken typ av skada som uppstår kan Chkdsk eventuellt återställa fildata. Chkdsk returnerar dock filsystemet till ett internt konsekvent tillstånd.

Orsak 4: Det finns filer i sökvägar som är djupare än MAX_PATH tecken

Du kan inte öppna, redigera eller ta bort en fil om det finns problem med filsökvägen.

Lösning 1: Använd ett automatiskt genererat 8.3-namn för att komma åt filen

Du kan lösa problemet genom att använda det automatiskt genererade 8.3-namnet för att få åtkomst till filen. Den här lösningen kan vara den enklaste lösningen om sökvägen är djup eftersom mappnamnen är för långa. Om sökvägen 8.3 också är för lång eller om 8,3 namn har inaktiverats på volymen går du till Lösning 2. Mer information om hur du inaktiverar 8.3-filnamn på NTFS-volymer finns i Inaktivera skapande av 8.3-namn på NTFS-partitioner.

Lösning 2: Byt namn på eller flytta en djup mapp

Byt namn på mappen så att målfilerna som är djupare än de MAX_PATH inte längre finns. Om du gör det börjar du i rotmappen eller någon annan lämplig plats. Byt sedan namn på mappar så att de har kortare namn. Om det här steget inte löser det här problemet, till exempel om en fil är mer än 128 mappar djup, går du till Lösning 4.

Lösning 3: Mappa en enhet till en mapp i sökvägens struktur

Mappa en enhet till en mapp i strukturen för sökvägen till målfilen eller mappen. Den här metoden förkortar den virtuella sökvägen.

Anta till exempel att du har en sökväg som är strukturerad på följande sätt:

\\ServerName\SubfolderName1\SubfolderName2\SubfolderName3\SubfolderName4\...

I den här sökvägen är det totala antalet tecken över 255 tecken. Om du vill korta längden på den här sökvägen till 73 tecken mappar du en enhet till SubfolderName4.

Lösning 4: Använd en nätverksresurs som är lika djup som mappen

Om lösningarna 1, 2 och 3 inte är praktiska eller inte löser problemet skapar du en nätverksresurs som är så djup i mappträdet som möjligt. Byt sedan namn på mapparna genom att öppna resursen.

Lösning 5: Använd ett verktyg som kan passera djupa sökvägar

Många Windows-program förväntar sig att den maximala sökvägslängden är kortare än 255 tecken. Dessa program allokerar bara tillräckligt med intern lagring för att hantera dessa vanliga sökvägar. NTFS har inte den här gränsen och kan innehålla mycket längre sökvägar.

Du kan uppleva det här problemet om du skapar en resurs någon gång i mappstrukturen som redan är ganska djup och sedan skapar en djup struktur under den punkten med hjälp av resursen. Vissa verktyg som körs lokalt i mappträdet kanske inte kan passera hela trädet med början från roten. Du kan behöva använda dessa verktyg på ett speciellt sätt så att de kan passera resursen. Dokumentationen för CreateFile API beskriver en metod för att bläddra igenom hela trädet i den här situationen.

Vanligtvis kan du hantera filer med hjälp av programvaran som skapar dem. Om du har ett program som kan skapa filer som är djupare än MAX_PATHkan du vanligtvis använda samma program för att ta bort eller hantera filerna. Du kan vanligtvis ta bort filer som skapas på en resurs med hjälp av samma resurs.

Orsak 5: Filnamnet innehåller ett reserverat namn i Win32-namnområdet

Om filnamnet innehåller ett reserverat namn i Win32-namnområdet, till exempel lpt1, kan du inte ta bort filen. Lös problemet genom att använda ett program som inte är Win32 för att byta namn på filen. Du kan använda ett POSIX-verktyg eller något annat verktyg som använder lämplig intern syntax för att använda filen.

Dessutom kan du använda vissa inbyggda kommandon för att kringgå de typiska reserverade Win32-namnkontrollerna om du använder en viss syntax för att ange sökvägen till filen.

Om du öppnar ett handtag till en fil med hjälp av den typiska Win32 CreateFile-mekanismen är vissa filnamn reserverade för gamla DOS-enheter. För bakåtkompatibilitet tillåts inte dessa filnamn och de kan inte skapas med hjälp av vanliga Win32-filanrop. Det här problemet är inte en begränsning för NTFS.

Du kan använda ett Win32-program för att kringgå de vanliga namnkontroller som görs när en fil skapas eller tas bort med hjälp av samma teknik som du använder för att bläddra i mappar djupare än MAX_PATH. Dessutom omfattas inte vissa POSIX-verktyg av dessa namnkontroller.

Orsak 6: Filnamnet innehåller ett ogiltigt namn i Win32-namnområdet

Du kan inte ta bort en fil om filnamnet innehåller ett ogiltigt namn. Filnamnet har till exempel ett avslutande blanksteg eller en avslutande punkt, eller så består filnamnet endast av ett blanksteg. Lös problemet genom att använda ett verktyg som använder lämplig intern syntax för att ta bort filen. Du kan använda syntaxen "\\?\" med vissa verktyg för att arbeta med dessa filer. Här är ett exempel:

del "\\?\c:\<path_to_file_that contains a trailing space.txt>"

Orsaken till det här problemet liknar orsak 4. Om du använder vanlig Win32-syntax för att öppna en fil som har avslutande blanksteg eller avslutande punkter i namnet tas efterföljande blanksteg eller punkter bort innan den faktiska filen öppnas. Du har till exempel två filer i samma mapp med namnet AFile.txt och AFile.txt , observera utrymmet efter filnamnet. Om du försöker öppna den andra filen med hjälp av vanliga Win32-anrop öppnar du den första filen i stället. Om du har en fil vars namn bara är ett blankstegstecken och försöker öppna den med hjälp av win32-standardanrop öppnar du filens överordnade mapp i stället. Om du i det här fallet försöker ändra säkerhetsinställningarna för dessa filer kanske du inte kan göra det, eller så kan du oväntat ändra inställningarna för olika filer. Om det här beteendet inträffar kanske du tror att du har behörighet till en fil som faktiskt har en restriktiv ACL.

Kombinationer av orsaker

Ibland kan du uppleva kombinationer av dessa orsaker. Det kan göra proceduren för att ta bort en fil mer komplex. Om du till exempel loggar in som datorns administratör kan du uppleva en kombination av Orsak 1 (du har inte behörighet att ta bort en fil) och Orsak 5 (filnamnet innehåller ett avslutande tecken som gör att filåtkomst omdirigeras till en annan eller obefintlig fil) och du kan inte ta bort filen. Om du försöker lösa orsak 1 genom att bli ägare till filen och lägga till behörigheter kanske du fortfarande inte kan ta bort filen eftersom ACL-redigeraren i användargränssnittet inte kan komma åt rätt fil på grund av orsak 6.

I det här fallet kan du använda subinacl-verktyget med växeln /onlyfile (det här verktyget ingår i Resource Kit) för att ändra ägarskap och behörigheter för en fil som annars inte är tillgänglig. Här är ett exempel:

subinacl /onlyfile "\\?\c:\<path_to_problem_file>" /setowner= domain\administrator /grant= domain\administrator=F

Obs!

Det här kommandot är en enda kommandorad som har omslutits för läsbarhet.

Den här exempelkommandoraden C:\<path_to_problem_file> ändrar filen som innehåller ett avslutande utrymme så att domänens\administratörskontot är ägare till filen och det här kontot har fullständig kontroll över filen. Du kan nu ta bort den här filen med hjälp av kommandot Del med samma "\\?\" syntax.