2010-01-04 9 views

Répondre

4

Pour autant que je sache, vous pouvez savoir si le fichier exists or not, mais il n'y a aucun moyen de savoir si c'est écrit, à part essayer d'écrire dessus. Il ne s'agit pas seulement de ne pas avoir le drapeau R; Les autorisations réseau et NTFS sont également impliquées (et probablement aussi les stratégies de groupe).

Si vous pouvez réécrire votre code, vous pouvez capturer le code de retour de l'opération d'écriture au errorlevel.

+0

+1 pour mentionner les permissions. Ce n'est certainement pas juste une question d'indicateur en lecture seule qui serait triviale à vérifier avec '% ~ ax' ou quelque chose comme ça. – Joey

0

vous pouvez le faire comme ceci en utilisant vbscript

Set objFS=CreateObject("Scripting.FileSystemObject") 
Set objArgs = WScript.Arguments 
strFile = objArgs(0) 
Set objFile = objFS.GetFile(strFile) 
If Not objFile.Attributes And 1 Then 
    WScript.Echo "The file is Read/Write." 
Else 
    WScript.Echo "The file is Read-only." 
End If 

Enregistrer sous check.vbs et sur la ligne de commande

c:\test> cscript //nologo check.vbs myfile 
+0

Les ACL sont également impliquées. Voir la réponse d'Álvaro. – Joey

0

Désolé pour les gens sonnant ici ..

Cela peut ne pas être à 100% ce que vous cherchez, mais j'ai utilisé cela avec en utiliser les fichiers journaux pour Apache Tomcat et il fonctionne parfaitement tout à fait.

Merci à @dbenham pour son code génial! https://stackoverflow.com/a/10520609/175063

SETLOCAL ENABLEDELAYEDEXPANSION 
REM TOMCAT LOGS 
FOR /r "D:\logs" %%X IN (*) DO (
    SET FileName=%%~nxX 
    2>nul ( >>D:\logs\!FileName!" (call)) && (
    REM DO STUFF HERE 
    SET ModDt=%%~tX 
    FOR /f "tokens=1-3 delims=.:/ " %%j IN ("!ModDt!") DO SET FDate=%%l-%%j-%%k&Set RegDate=%%j-%%k-%%l 
    IF "%CurrentDate%" NEQ "!FDate!" (
     IF %%~zX GTR 0 (
      ECHO ARCHIVING "D:\logs\!FileName!" >> %logfile% 
      7za.exe -tzip -y a "D:\Zips\%COMPUTERNAME%-Tomcat-!RegDate!-compressed.zip" "D:\logs\!FileName!" && (
      DEL /Q "D:\logs\!FileName!" 
      ) || (
       if "%ERRORLEVEL%" == "2" (
        echo Zipping failed ^(exit status %ERRORLEVEL%^). Trying again in 5 seconds... 
       ) else (
        echo Zip completed with warnings ^(most likely because a file was locked by another 
        echo process and had to be skipped^). Trying again in 5 seconds... 
       ) 
       del "D:\Zips\%COMPUTERNAME%-Tomcat-!RegDate!-compressed.zip" >NUL 2>&1 
       PING 0.0.0.0 -n 6 -w 1000 >NUL 
      ) 
     ) 
    ) 
    REM END OF UNLOCKED ZONE 
    ) || (
    ECHO FILE IS LOCKED 
    ) 
) 
-1
ls -l foo.txt 

sorties -r - r - r-- pour un fichier non inscriptible sorties -rw-r - r-- pour un fichier inscriptible

vous pouvez stocker la value et vérifie si le 3ème caractère est "w" pour writable ou "-" pour non writable.

en utilisant une syntaxe similaire à %myVar:~2,1% dans une instruction conditionnelle.

ne sait pas comment cela dépendrait du système d'exploitation.

+2

'ls -l' fonctionnerait avec linux mais pas avec windows – jeb