Ticket #42219

テキストファイルとバイナリファイルの判別

오픈 날짜: 2021-05-11 10:50 마지막 업데이트: 2021-05-13 21:47

Reporter:
(Anonymous)
소유자:
(None)
Type:
Status:
Open
Component:
(None)
MileStone:
(None)
Priority:
5 - Medium
Severity:
5 - Medium
Resolution:
None
File:
None

Details

(1) メニューから「プラグイン」-「手動展開」を実行しておく

(2) PDF が複数入っているフォルダどうしを比較する

(3) 比較結果の画面で、「テキスト ファイルは同一です」と「バイナリ ファイルは同一です」が混在して表示される

Excel ファイルの入ったフォルダどうしを比較しても、同じ現象になります。

ソース上でバイナリファイルかどうかの判別結果がスルーされているようです。

【/Src/diffutils/src/analyze.c】

  1. struct change * diff_2_files (struct file_data filevec[], int depth, int * bin_status,
  2. int bMoved_blocks_flag, int * bin_file)
  3. {
  4. // bin_file にバイナリかどうかの判別結果が格納されるが、
  5. // 呼び出し元で参照しているのは bin_status のほうなので、
  6. // 期待する表示結果にならない
  7. }

【/Src/FolderCmp.cpp】

  1. int FolderCmp::prepAndCompareFiles(DIFFITEM &di)
  2. {
  3. // 略
  4. m_pDiffUtilsEngine->SetFileData(2, diffdata10.m_inf);
  5. bRet = m_pDiffUtilsEngine->Diff2Files(&script10, 0, &bin_flag10, false, nullptr);
  6. m_pDiffUtilsEngine->GetTextStats(0, &m_diffFileData.m_textStats[1]);
  7. m_pDiffUtilsEngine->GetTextStats(1, &m_diffFileData.m_textStats[0]);
  8. m_pDiffUtilsEngine->SetFileData(2, diffdata12.m_inf);
  9. bRet = m_pDiffUtilsEngine->Diff2Files(&script12, 0, &bin_flag12, false, nullptr);
  10. m_pDiffUtilsEngine->GetTextStats(0, &m_diffFileData.m_textStats[1]);
  11. m_pDiffUtilsEngine->GetTextStats(1, &m_diffFileData.m_textStats[2]);
  12. m_pDiffUtilsEngine->SetFileData(2, diffdata02.m_inf);
  13. bRet = m_pDiffUtilsEngine->Diff2Files(&script02, 0, &bin_flag02, false, nullptr);
  14. m_pDiffUtilsEngine->GetTextStats(0, &m_diffFileData.m_textStats[0]);
  15. m_pDiffUtilsEngine->GetTextStats(1, &m_diffFileData.m_textStats[2]);
  16. // 略
  17. // ↓ 参照しているフラグが違う
  18. if (bin_flag10 || bin_flag12)
  19. code |= DIFFCODE::BIN;
  20. else
  21. code |= DIFFCODE::TEXT;
  22. // 略
  23. }

Ticket History (3/10 Histories)

2021-05-11 10:50 Updated by: None
  • New Ticket "テキストファイルとバイナリファイルの判別" created
2021-05-11 21:12 Updated by: sdottaka
댓글 올리기

こちらにあるExcelファイルが複数格納されているフォルダやPDFファイルが複数ファイルが格納されているで試してみましたが、再現できませんでした。

Wrap_DiffUtils.cpp 221行目に書いてあるように、bin_status(bin_flag) は、-1ならば差異があるバイナリファイル、+1ならば同じバイナリファイル、0ならばバイナリではないと考えています。

  1. // diff_2_files set bin_flag to -1 if different binary
  2. // diff_2_files set bin_flag to +1 if same binary

もし、こちらで再現できるファイルがありましたらご連絡いただけると助かります。

2021-05-12 11:07 Updated by: None
댓글 올리기

Reply To sdottaka

PDF と Excel で、起きている現象が異なるようです。

Excel での挙動は下記のような感じでした。

※PDF のほうは再現条件をもう少し検証してみます。

もし、こちらで再現できるファイルがありましたらご連絡いただけると助かります。

自作のファイルだと再現しませんでした。

職場にデバッグできる環境がないのがつらいです…

v2.16.12.1

  • CompareMSExcelFiles.sct を有効にした状態でスタート
  • メニューから「自動比較前処理」「自動展開」を選択しておいて *.xlsx の入ったフォルダを比較
    →「テキスト ファイルは異なります」
  • 一旦、比較結果フォルダやフォルダ選択ダイアログを閉じる
  • メニューから「手動比較前処理」「手動展開」を選択しておいて *.xlsx の入ったフォルダを比較
    →「バイナリ ファイルは異なっています」
  • 比較結果画面を開いたまま続行
  • メニューから「自動比較前処理」「自動展開」を選択して表示更新(F5)
    →「バイナリ ファイルは異なっています」のまま
  • メニューから「手動比較前処理」「手動展開」を選択して表示更新(F5)
    →「テキスト ファイルは異なります」に切り替わる
  • メニューから「自動比較前処理」「自動展開」を選択して表示更新(F5)
    →「バイナリ ファイルは異なっています」に切り替わる

操作の前半と後半で、「自動/手動」「テキスト/バイナリ」の組み合わせが異なっています。

2021-05-12 14:33 Updated by: None
댓글 올리기

Reply To (Anonymous)

Reply To sdottaka

PDFを展開可能なプラグインは入っていない状態でテストしてみました。

  • オプション (コードページ) で「'mlang.dll'を使用して~」をON
  • *.pdf の入ったフォルダを比較
    →自動、手動の設定どちらでも「テキスト ファイルは異なります」「バイナリ ファイルは異なっています」が混在
  • オプション (コードページ) で「'mlang.dll'を使用して~」をOFF
  • *.pdf の入ったフォルダを比較
    →「バイナリ ファイルは異なっています」の表示だけになる

mlang.dll の仕様に依存する現象のようなので、こちらは一旦取り下げさせて下さい。

2021-05-12 20:42 Updated by: sdottaka
댓글 올리기

(匿名) への返信

Reply To sdottaka PDF と Excel で、起きている現象が異なるようです。 Excel での挙動は下記のような感じでした。

ご連絡ありがとうございます。 これは、プラグイン自動展開を選択している場合、プラグインがExcelファイルをテキスト化するため、「テキスト ファイルは異なります」という表示になります。 ですので、バイナリファイルかどうかを検知したい場合は、プラグインの自動展開を無効にしていただければと思います。

PDFの比較でmlang.dll を使用すると一部テキストファイルとみなされることを確認しました。 将来的には、mlang.dll の代わりに ICU ライブラリの文字コードセット検出や Mozilla's Universal Charset Detector 等使用してみたいと思っているのですがなかなかやる気がわいてきていません。

2021-05-13 08:28 Updated by: None
댓글 올리기
> これは、プラグイン自動展開を選択している場合、プラグインがExcelファイルをテキスト化するため、
> 「テキスト ファイルは異なります」という表示になります。


返信ありがとうございます。

自動展開→比較対象ファイルがテキストに展開される
手動展開→バイナリのまま

のはずですが、投稿のとおり、比較結果画面を開いたまま続行すると、オプションの選択と表示結果の組み合わせが逆転します。

2021-05-13 08:44 Updated by: sdottaka
댓글 올리기

失礼いたしました。こちらでの事象は少し違いますが、プラグイン自動展開等の設定変更が反映されていないように見えます。 調べてみます。

(匿名) への返信

これは、プラグイン自動展開を選択している場合、プラグインがExcelファイルをテキスト化するため、
「テキスト ファイルは異なります」という表示になります。


返信ありがとうございます。

自動展開→比較対象ファイルがテキストに展開される
手動展開→バイナリのまま

のはずですが、投稿のとおり、比較結果画面を開いたまま続行すると、オプションの選択と表示結果の組み合わせが逆転します。

2021-05-13 09:07 Updated by: sdottaka
댓글 올리기
2021-05-13 21:15 Updated by: sdottaka
댓글 올리기

最新のコミットだと「手動比較前処理」と「自動比較前処理」を切り替えるとクラッシュことがあるようです。 調べてみます。

2021-05-13 21:47 Updated by: sdottaka
댓글 올리기

「手動比較前処理」と「自動比較前処理」を切り替えというよりも、単にフォルダの再比較を何回もすると落ちることがあるということでした。 以下のコミットで修正しています。

https://github.com/WinMerge/winmerge/commit/47a49d1e30c63a9ba94e2d8cb7d6c42b233d5cd1

Attachment File List

No attachments

Edit

You are not logged in. I you are not logged in, your comment will be treated as an anonymous post. » Login