2016-07-28 24 views
0

wie man überprüft, ob der Inhalt der Datei ist die gleiche wie die Revision in Server JAVA API. Bevor ich irgendeine Datei in das perforfet-Depot aktualisiere, möchte ich prüfen, ob es irgendeinen Unterschied im Inhalt der lokalen Datei und der Depot-Datei gibt. Wenn es keinen Unterschied gibt, dann ignoriere diese Datei.Wie man diff von zwei Versionen der Datei perforce depot

+1

Mögliche Duplikate von [Ermitteln, ob zwei Dateien den gleichen Inhalt speichern] (http://stackoverflow.com/questions/27379059/determine-if-two-files-store-the-same-content) –

Antwort

2

Ich glaube, Sie die getDiffFiles wollen() -Methode:

https://www.perforce.com/perforce/r15.1/manuals/p4java-javadoc/com/perforce/p4java/impl/mapbased/client/Client.html#getDiffFiles

Alternativ für die spezifische Sache, du bist Wenn Sie keine unveränderten Dateien senden, verwenden Sie einfach die Sendeoption "leaveUnchanged", anstatt die selbe Arbeit selbst auszuführen.

+0

Ich mag dieses. Ich werde es versuchen, diese Option "leaveUnchanged" –

+0

zu setzen Beachten Sie, dass Sie die "SubmitOptions" für jeden Übergeben Befehl einzeln festlegen können, oder Sie können auch die "SubmitOptions" für Ihren gesamten Arbeitsbereich festlegen, und dann jede Übergabe verhält sich so . –

2

Ja einfach zu tun. Nur generieren Sie einen MD5-Hash der ursprünglichen Datei und vor dem erneuten Update generieren Sie einen MD5-Hash der neuen Datei.

Jetzt vergleichen Sie die Hashes der beiden Dateien. Wenn beide gleich sind, dann sind die Inhalte beider Dateien gleich und wenn nicht, dann sind sie unterschiedlich und Sie können gut updaten. Hier

ist ein Dienstprogramm, zu generieren und überprüfen MD5 leicht,

public class MD5Utils { 
    private static final String TAG = "MD5"; 

    public static boolean checkMD5(String md5, File updateFile) { 
     if (TextUtils.isEmpty(md5) || updateFile == null) { 
      Log.e(TAG, "MD5 string empty or updateFile null"); 
      return false; 
     } 

     String calculatedDigest = calculateMD5(updateFile); 
     if (calculatedDigest == null) { 
      Log.e(TAG, "calculatedDigest null"); 
      return false; 
     } 

     Log.v(TAG, "Calculated digest: " + calculatedDigest); 
     Log.v(TAG, "Provided digest: " + md5); 

     return calculatedDigest.equalsIgnoreCase(md5); 
    } 

    public static String calculateMD5(File updateFile) { 
     MessageDigest digest; 
     try { 
      digest = MessageDigest.getInstance("MD5"); 
     } catch (NoSuchAlgorithmException e) { 
      Log.e(TAG, "Exception while getting digest", e); 
      return null; 
     } 

     InputStream is; 
     try { 
      is = new FileInputStream(updateFile); 
     } catch (FileNotFoundException e) { 
      Log.e(TAG, "Exception while getting FileInputStream", e); 
      return null; 
     } 

     byte[] buffer = new byte[8192]; 
     int read; 
     try { 
      while ((read = is.read(buffer)) > 0) { 
       digest.update(buffer, 0, read); 
      } 
      byte[] md5sum = digest.digest(); 
      BigInteger bigInt = new BigInteger(1, md5sum); 
      String output = bigInt.toString(16); 
      // Fill to 32 chars 
      output = String.format("%32s", output).replace(' ', '0'); 
      return output; 
     } catch (IOException e) { 
      throw new RuntimeException("Unable to process file for MD5", e); 
     } finally { 
      try { 
       is.close(); 
      } catch (IOException e) { 
       Log.e(TAG, "Exception on closing MD5 input stream", e); 
      } 
     } 
    } 
} 
+0

Danke für die Antwort . Aber können wir nicht dasselbe mit der Perforce JAVA API tun? –

+1

Ich fürchte, du kannst nicht. Sie müssen dafür die Standard-JAVA-APIs verwenden. –

+0

Vielen Dank für Ihre schnelle Antwort –