Pergunta

Eu tenho um conjunto de arquivos com vários links para eles.

Os arquivos são de propriedade do controle de origem do TFS, mas outros links para eles são feitos para eles. Como excluo os links adicionais sem limpar o bit reado.

É seguro assumir:

  • Os arquivos têm mais de um link para eles
  • Você não está excluindo o nome de propriedade do TFS
  • Não há condições potenciais de raça
  • Você tem controle total da ACL para os arquivos
  • A máquina não perderá energia, nem seu programa será morto, a menos que demore muito.

Não é seguro assumir:

  • O bit readonly está definido (não defina se não for)
  • Você pode deixar o pouco de readsma se encontrar um erro e ele foi inicialmente definido

Não migre para o SuperUser - se migrar para lá a resposta é impossível porque nenhuma ferramenta padrão pode fazer isso.

Em um sistema hipotético *nix, no qual é necessário permitir gravar permissão em um arquivo para excluí -lo, há uma solução envolvendo fchmod (). No entanto, o sistema que exibe esse comportamento é um sistema Windows.

Foi útil?

Solução

Você já tentou ativar o Sebackuppprivilege e o SeresteRitilege, que permitem que os administradores relaxem muitas das verificações de segurança?

Você pode encontrar Este tópico do grupo de notícias útil.

EDIT: Para fazê -lo sem privilégios e, sem criar uma condição de corrida, você precisará do suporte transacional dos NTFs presentes no Vista e acima. Btw, você pode definir atributos usando um identificador, passe file_basic_info para SetFileInformationByHandle, que pode ser negociado, veja as notas. Ou você pode usar o FindFirstFileName para encontrar outro link rígido para o mesmo arquivo que não está sendo excluído, para definir somente leitura.

Outras dicas

Obrigado a 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);
        }
    }
}

Isso não é possível. Um link rígido é apenas mais um nome para um arquivo; Você pode ter muitos links rígidos, mas existe apenas um objeto de arquivo subjacente (dados, descritor de segurança, atributos, horários de arquivo etc.). Se o objeto Arquivo tiver o somente atributo de leitura definido, qualquer link rígido por definição também terá o atributo definido.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top