Frage

Ich habe eine Reihe von Dateien mit mehreren Links zu ihnen.

Die Dateien werden von TFS Quellcodeverwaltung im Besitz, sondern auch andere Links zu ihnen, um sie gemacht. Wie lösche ich die zusätzliche Verbindungen, ohne den Nur-Lese-Bit zu löschen.

Es ist sicher anzunehmen:

  • Die Dateien haben mehr als eine Verbindung zu ihnen
  • Sie den Namen nicht löschen von TFS Besitz
  • Es gibt keine potenziellen Rennbedingungen
  • Sie haben ACL volle Kontrolle für die Dateien
  • Die Maschine wird nicht verlieren Macht, noch wird Ihr Programm getötet werden, wenn sie Art und Weise zu lange dauern.

Es ist nicht sicher davon ausgehen:

  • Der Nur-Lese-Bit gesetzt (richtet es nicht, wenn sie nicht)
  • Sie können die Nur-Lese-Bit klar verlassen, wenn ein Fehler auftritt, und es wurde anfänglich

wandern nicht Superuser -. Wenn migriert dort die Antwort nicht möglich ist, weil kein Standardwerkzeug kann dies tun

Auf einem hypothetischen * nix-System, in das man benötigt Schreibberechtigung für eine Datei zu löschen, gibt es eine Lösung beteiligt fchmod (). Doch das System, dass dieses Verhalten zeigt, ist ein Windows-System.

War es hilfreich?

Lösung

Haben Sie versucht, ermöglicht SeBackupPrivilege und SeRestorePrivilege, die Administratoren erlauben viele der Sicherheitskontrollen zu entspannen?

Sie können feststellen, diese Newsgroup-Thread hilfreich.

EDIT: Um es ohne Privilegien zu tun, und ohne eine Race-Bedingung zu schaffen, werden Sie Transaktions NTFS-Unterstützung in Vista und höher benötigen. BTW, können Sie Attribute festlegen einen Griff verwenden, übergeben FILE_BASIC_INFO SetFileInformationByHandle , die getätigt werden können, siehe die Hinweise. Oder Sie können FindFirstFileName verwenden Sie einen anderen harten Link auf die gleiche Datei zu finden, die nicht gelöscht werden soll, mit denen Satz schreibgeschützt ist.

Andere Tipps

Dank Ben Voigt:

#include <windows.h>

int main(int argc, char **argv)
{
    while (*++argv) {
        HANDLE h;
        DWORD attrs;

        attrs = GetFileAttributes(*argv);
        SetFileAttributes(*argv, attrs & ~FILE_ATTRIBUTE_READONLY);
        h = CreateFile(*argv, GENERIC_READ|GENERIC_WRITE, 7, NULL, OPEN_EXISTING,
                    FILE_FLAG_DELETE_ON_CLOSE, NULL);
        SetFileAttributes(*argv, attrs);
        if (h != INVALID_HANDLE_VALUE) {
            CloseHandle(h);
        }
    }
}

Dies ist nicht möglich. Ein harter Link ist nur ein anderer Name für eine Datei; Sie können viele harte Links, aber es gibt nur eine zugrunde liegende Dateiobjekt (Daten, Sicherheitsbeschreibung, Attribute, Dateizeiten, etc.). Wenn das Dateiobjekt hat das einzige Attribut Satz lesen, dann per Definition keine harten Links wird auch das Attribut gesetzt haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top