4 votes

Historique des fichiers - Impossible de rechercher les modifications apportées aux bibliothèques des utilisateurs et d'effectuer une sauvegarde des fichiers modifiés pour la configuration.

Lorsque j'essaie d'exécuter l'outil Historique des fichiers dans Windows 8, il fonctionne pendant environ 2 secondes puis s'arrête. Aucun fichier n'est sauvegardé sur le lecteur sélectionné.

Dans l'observateur d'événements, la seule erreur qui apparaît est :

Unable to scan user libraries for changes and perform backup of modified files 
for configuration
C:\Users\win8User\AppData\Local\Microsoft\Windows\FileHistory\Configuration\Config

J'ai essayé de supprimer à la fois les fichiers de configuration et le répertoire FileHistory sur le disque cible. En configurant à nouveau l'historique des fichiers, on obtient la même erreur.

Existe-t-il un meilleur moyen de trouver la cause de l'échec ? Ou faire en sorte que l'outil d'historique des fichiers crée un fichier journal plus détaillé qui montre la cause du problème ?

1voto

apple16 Points 166

Voici ce que j'ai fait. Je ne suis pas sûr que toutes ces étapes soient nécessaires, mais je voulais juste être sûr.

1.

Control panel -> File history -> Advanced Settings -> Open file history event logs et réparer/supprimer tous les fichiers qui perturbent l'historique des fichiers. Pour moi, il y en avait plusieurs dans ce dossier :

AppData\Local\Microsoft\Windows\WER\ReportArchive\AppCrash_explorer.exe xxxxx

Et je les ai supprimés. Elles n'avaient pas l'air importantes.

2 . J'ai écrit un script Python rapide pour trouver tous les fichiers avec des caractères non-ascii dans leurs noms. Je les ai tous renommés manuellement. Cela peut être la raison pour laquelle l'historique des fichiers échoue sur certains dossiers musicaux !

import os,string
import sys

validChars='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ. #^=!()&,_\'-+@%[]{$};`~'

for currdir,folders,filenames in os.walk(r'C:\Users\<username>'):

    //Max filename len on ntfs is 255, but file history adds "F:\FileHistory\<username>\<computer name>\Data" to the front the files and a timestamp to the end so the file really needs to be less than 200 to be safe
    if len(currdir)>200:
        print 200,currdir

    if filter(lambda x: x in validChars, currdir[2:].replace('\\',''))!=currdir[2:].replace('\\',''):
        print 'chars',currdir,

    for filename in filenames:
        if filter(lambda x: x in validChars, filename)!=filename:
            print 'char2',os.path.join(currdir,filename)

EDIT : Ne supprimez pas les fichiers Autodesk Inventor, cela casserait Autodesk. o_o

3.

Historique des fichiers -> sélectionner le lecteur -> (choisir votre lecteur) -> (choisir votre dernière sauvegarde) -> l'historique des fichiers donne un avertissement sur le fait que vos dernières sauvegardes ne sont pas sur ce lecteur. J'ai cliqué sur OK.

1voto

User5910 Points 526

En scie cette erreur sur Windows 10 a été causée par un fichier JPEG avec des drapeaux d'attributs de fichiers corrompus, en particulier un bit Directory bidon. Apparemment, l'historique des fichiers a essayé d'obtenir les enfants de ce non-répertoire, a échoué et a silencieusement interrompu l'ensemble de la sauvegarde.

File History fait preuve d'une grave négligence en ce qui concerne a) le signalement des erreurs, et b) le traitement des erreurs.

Recherche de fichiers à problèmes

J'ai écrit la fonction PowerShell suivante pour rechercher les attributs de fichiers hors limites. Utilisez-la comme suit :

  1. Lancer PowerShell
  2. Collez toute la fonction, y compris la ligne vide après le dernier "}".
  3. Exécutez-le en tapant check-Attribute et en spécifiant un chemin facultatif, ex. check-Attribute c:\ . Si aucun chemin d'accès n'est donné, l'analyse commencera dans le répertoire courant.

    Function check-Attributes { Param([string]$path)

    # Collect all possible attribute bits
    $attrBits = 0
    [enum]::GetValues([System.Io.FileAttributes]) | ForEach-Object {
        $attrBits = $attrBits -bor $_
    }
    $attrBitMask = -bnot $attrBits
    
    Write-Host "Scanning for out-of-range file/directory attributes..."
    $checked = 0
    $out_of_range = 0
    Get-ChildItem $path -Recurse -ErrorAction SilentlyContinue -ErrorVariable FailedItems | ForEach-Object {
        ++$checked
        Write-Verbose -Message "Checking $_"
        if (($_.Attributes -band $attrBitMask) -ne 0) {
            Write-Host $_.FullName "has out of range attributes:" $_.Attributes
            ++$out_of_range
        }
    }
    
    if ($out_of_range) {
        Write-Host
    }
    Write-Host "Checked" $checked "files/directories, found" $out_of_range "with attributes out of range."
    
    if ($FailedItems) {
        # $FailedItems is an array of System.Management.Automation.ErrorRecord
        Write-Host "`nEncountered" $FailedItems.length "error(s) while scanning:"
        $FailedItems | Foreach-Object {$_.CategoryInfo}
    }

    }

Il n'est pas garanti que le test des attributs permette de trouver tous les problèmes de corruption. Cependant, comme il signale également les problèmes d'itération des répertoires, il peut exposer d'autres problèmes qui font échouer l'historique des fichiers.

Comment j'ai découvert le problème

J'ai utilisé "Settings Options de sauvegarde pour ce faire. Pour l'ouvrir, recherchez "sauvegarde" dans les paramètres ou cliquez sur Paramètres>Système>Stockage>Afficher les options de sauvegarde>Plus d'options.

Le journal des erreurs peut également être utile. Pour passer directement à la catégorie correcte de l'observateur d'événements pour voir les erreurs, faites défiler jusqu'au bas de la boîte de dialogue ci-dessus, cliquez sur Voir les paramètres avancés (cela ouvre le Panneau de configuration)>Paramètres avancés>Ouvrir les journaux d'événements de l'historique des fichiers pour voir les événements ou erreurs récents. Le chemin du journal est %SystemRoot%\System32\Winevt\Logs\Microsoft-Windows-FileHistory-Engine%4BackupLog.evtx

Le fichier problématique se trouvait dans l'un des centaines de sous-répertoires de mon répertoire "Photos". J'ai d'abord créé un nouveau répertoire parallèle "Photos-Pending-Backup", je l'ai exclu de la sauvegarde de File History, puis j'y ai déplacé tous les répertoires de "Photos". J'ai lancé l'historique des fichiers pour vérifier l'exactitude des données et l'absence d'erreurs.

Important : Lors de la vérification du succès, regardez la section Aperçu des options de sauvegarde pour une nouvelle heure d'achèvement. Il n'y a pas d'indication d'erreurs ici.

Après une sauvegarde réussie, j'ai déplacé de manière incrémentielle des lots de répertoires dans "Photos" jusqu'à ce qu'une sauvegarde échoue, puis je les ai déplacés jusqu'à ce qu'une sauvegarde réussisse, en répétant jusqu'à ce que je trouve le problème.

J'ai décidé de ne pas exclure tous les sous-répertoires de la sauvegarde car a) cela prendrait beaucoup de temps de les choisir un par un à l'aide de la commande Options de sauvegarde UI, b) il serait facile d'en manquer un puisque les dossiers exclus ne sont pas affichés dans l'ordre de tri, et c) cela prendrait également beaucoup de temps pour les désexclure.

0voto

Lewis Newton Points 1

J'ai adapté le script posté par apple16 ci-dessus pour le faire fonctionner en Python 3 et l'ai amélioré un peu. En utilisant une combinaison d'exclusion sélective des dossiers de l'historique des fichiers et ce script pour examiner les problèmes possibles, j'ai réduit mon problème à deux fichiers avec des noms presque identiques dans le même répertoire. Les deux fichiers avaient le mot Espanol dans le nom de fichier avec un tilde sur le n. Cependant, l'un d'eux avait l'encodage suivant : Espan \N {COMBINING TILDE}ol et l'autre comme Espa \N {LATIN PETIT LETTRE N AVEC TILDE}ol. Les deux noms de fichiers sont listés de manière identique dans l'Explorateur Windows avec le tilde sur le n. Lorsque je place ces deux fichiers dans des dossiers séparés, ils sont sauvegardés sans problème par l'historique des fichiers, mais lorsqu'ils sont dans le même répertoire, ils semblent interférer l'un avec l'autre et bloquer le fonctionnement de l'historique des fichiers.

Voici le script CheckFileNames.py que j'ai utilisé :

#CheckFileNames.py, 10 May 2016, LewisN
#Python 3 version adapted and enhanced by LewisN; based on script by apple16 posted on http://superuser.com/
#Scans Windows file system for potentially problematic directories and files affecting File History operation.
#---------------------------------------------------------------------------------
#SET THE FOLLOWING BEFORE RUNNING:
DirectoryTreeToScan = r'C:\Users\<username>'
DaysBackToList = 0    #Number of days back to list. Set to 0 to list all FLAGGED FILES regardless of file dates.
PrintDates = False    #Set True to show File Creation and Modification dates.

#You may also want to play with the following settings:
flagDirLen=200
flagFullNameLen=200
  # Max filename len on Windows is ~255, but File History adds "F:\FileHistory\<username>\<computer name>\Data" to 
  # the front the files and a timestamp to the end, so backing off on name lengths flagged to be safe.
  # Files with long filenames are actually saved to F:\FileHistory\<username>\<computer name>\Data\$OF and can be
  # retrieved using the File History GUI, but you may want to avoid this.  Also there may be cases where
  # long paths and/or filenames cause errors.

#Notes: 
#  1. Filenames with Unicode characters from various languages are also often ok for File History.  
#     This script exposes these characters so they can be examined for potential problems.
#  2. Filenames with initial dots (also flagged here) are ok for File History (use cmd prompt to edit them).
#---------------------------------------------------------------------------------

import os,string,time,datetime
import sys

validChars="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ. #^=!()&,_'-+@%[]{$};`~"
disallowedChars=r'\/:*?"<>|'
# Note that many other characters are also actually allowed.  Windows expressly disallows \/:*?"<>|    

lastdirheader=''

def PrintDirHeaderIfNeeded():
    global lastdirheader
    if currdir!=lastdirheader:
        print ('===FLAGGED FILES IN DIRECTORY',currdir.encode("ascii","replace").decode()+':')
        lastdirheader = currdir
        return;

def PrintFileDates():
    fname=os.path.join(currdir,filename)
    print('      Created: ' + time.ctime(os.path.getctime(fname)) + ', Modified: ' + time.ctime(os.path.getmtime(fname)))
    return;

def IsRecent(DaysBack):
    fname=os.path.join(currdir,filename)
    if DaysBack==0: return True   # 0 disables limiting file listings based on file dates
    if ((datetime.datetime.now()-datetime.datetime.fromtimestamp(os.path.getctime(fname))).days<DaysBack) or \
       ((datetime.datetime.now()-datetime.datetime.fromtimestamp(os.path.getmtime(fname))).days<DaysBack):
        return True 
    else: return False;

for currdir,folders,filenames in os.walk(DirectoryTreeToScan):

    if len(currdir)>flagDirLen:
        print('===DIRLEN>' + str(flagDirLen) + ':', currdir.encode("ascii","replace").decode())

    if ''.join([x for x in currdir[2:].replace('\\','') if x in validChars])!=currdir[2:].replace('\\',''):
        print('===DIR CHARS+:',currdir.encode("ascii","namereplace").decode())

    for filename in filenames:

        if (len(currdir)+len(filename)>flagFullNameLen) and IsRecent(DaysBackToList):
            PrintDirHeaderIfNeeded()
            print('     FULLNAMELEN>' + str(flagFullNameLen) + ':', filename.encode("ascii","replace").decode())
            if PrintDates: PrintFileDates() 

        if ''.join([x for x in filename if x in validChars])!=filename and IsRecent(DaysBackToList):
            PrintDirHeaderIfNeeded()
            print('     CHARS+:',filename.encode("ascii","namereplace").decode())
            if PrintDates: PrintFileDates() 

        if filename[0:1] == "." and IsRecent(DaysBackToList):
            PrintDirHeaderIfNeeded()
            print('     INITIAL DOT:',filename.encode("ascii","replace").decode())
            if PrintDates: PrintFileDates()

        if any(True for x in filename if x in disallowedChars) and IsRecent(DaysBackToList):
            PrintDirHeaderIfNeeded()
            print('     DISALLOWED (' + disallowedChars + '):',filename.encode("ascii","replace").decode())
            if PrintDates: PrintFileDates()

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X