Question

J'ai un ensemble de fichiers avec plusieurs liens vers eux.

Les fichiers sont la propriété de contrôle de code source TFS, mais d'autres liens vers eux sont faits pour eux. Comment puis-je supprimer les liens supplémentaires sans effacer le bit en lecture seule.

Il est raisonnable de supposer:

  • Les fichiers ont plus d'un lien pour les
  • Vous ne supprimez pas le nom appartenant TFS
  • Il n'y a pas de conditions de course possibles
  • Vous avez le contrôle ACL complète pour les fichiers
  • La machine ne perd jamais la puissance, ni sera votre programme sera tué à moins que cela prend trop de temps.

Il est pas sûr de supposer:

  • Le bit est réglé en lecture seule (ne contiendraient pas si ce ne est pas)
  • Vous pouvez laisser le bit en lecture seule clair si vous rencontrez une erreur et il a été initialement fixé

Ne pas migrer vers super-utilisateur -. S'il migré la réponse est impossible, car aucun outil standard peut faire

Sur un système nix hypothétique * dans lequel on a besoin écrire sur un fichier pour le supprimer, il y a une solution impliquant fchmod (). Cependant, le système présentant ce comportement est un système Windows.

Était-ce utile?

La solution

Avez-vous essayé permettant SeBackupPrivilege et SeRestorePrivilege, qui permettent aux administrateurs de se détendre la plupart des contrôles de sécurité?

Vous trouverez peut-être ce fil de newsgroup utile.

EDIT: Pour le faire sans privilèges et sans créer une condition de course, vous aurez besoin d'un support NTFS transactionnel présent dans Vista et plus. BTW, vous pouvez définir des attributs à l'aide d'une poignée, passer FILE_BASIC_INFO SetFileInformationByHandle , qui peut être traitée, voir les notes. Vous pouvez aussi utiliser FindFirstFileName pour trouver un autre lien dur vers le même fichier qui n'est pas supprimé, avec lequel ensemble en lecture seule.

Autres conseils

Merci à 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);
        }
    }
}

Ceci est impossible. Un lien est juste un autre nom pour un fichier; vous pouvez avoir beaucoup de liens durs, mais il n'y a qu'un seul objet de fichier sous-jacent (données, descripteur de sécurité, les attributs, les temps de fichiers, etc.). Si l'objet de fichier a la lecture seule ensemble d'attributs, puis tous les liens durs par définition auront également l'ensemble d'attributs.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top