在 dreamweaver 的文件面板选择两个文件,右击之后可以看到有"比较本地文件"这个选项,可惜 dreamweaver 本身并没有提供文件比较的功能,需要在“首先参数”中指定第三方文件比较工具。我原本装有 gvim ,支持文件比较,但需要指定-d参数进入比较模式(gvim.exe -d <LEFT_FILE_PATH> <RIGHT_FILE_PATH>)。令人发指的是 dreamweaver 只能指定可执行程序,不能作任何 customize,也就是完全不能添加参数,有够dumb。

无奈之下,只好操起非常不熟练的 c,做了个 adapter, 有需要在 dreamweaver 中使用文件比较功能的朋友请点击这里下载

原理

程序比较简单,用一个文本文件存储自定义命令,adapter 收到 dreamweaver 传入的两个文件名之后,读取文本文档中的自定义命令样式,用 sprintf 把文件名格式进去之后再调用。

源代码:

main.c

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
/*
 * File:   main.c
 * Author: Klesh Wong
 *
 * Created on 2008年11月10日, 下午15:07
 */

#include <windows.h>
#include <stdio.h>

int main(int argc, char** argv) {
    char *cwd_path = (char *) getcwd(NULL, 0);
    char *cnf_name = "cmd";
    char *cnf_path = (char *) calloc(strlen(cwd_path) + strlen(cnf_name) + 2, sizeof (char));
    strcat(cnf_path, cwd_path);
    strcat(cnf_path, "\\");
    strcat(cnf_path, cnf_name);
    FILE *cmd_file;

    if (cmd_file = fopen(cnf_path, "r")) {

        char cmd_tpl[200], cmd_str[255];
        // process cmd config file
        char c;
        int i = 0;
        int skip = FALSE;
        while ((c = getc(cmd_file)) > 0) {
            if (i == 0) {
                if (c == ' ') // skip initial space
                    continue;
                else if (c == '#') // skip comment
                    skip = TRUE;
            }
            if (c == 'r' || c == 'n') {
                if (i)
                    break;
                else
                    skip = FALSE;
            } else {
                if (!skip) cmd_tpl[i++] = c;
            }
        }
        // done, close cmd file.
        fclose(cmd_file);

        // add string terminate to command template.
        cmd_tpl[i] = NULL;
        // add filenames to command template.
        sprintf(cmd_str, cmd_tpl, argv[1], argv[2]);

        // launch command without waiting it returns which system() function does.
        STARTUPINFO startinfo;
        ZeroMemory(&startinfo, sizeof (STARTUPINFO));
        startinfo.cb = sizeof (STARTUPINFO);
        startinfo.lpReserved = NULL;
        startinfo.lpDesktop = NULL;
        startinfo.lpTitle = NULL;
        startinfo.dwFlags = 0;
        startinfo.cbReserved2 = 0;
        startinfo.lpReserved2 = NULL;
        PROCESS_INFORMATION procinfo;
        ZeroMemory(&procinfo, sizeof (PROCESS_INFORMATION));
        CreateProcess(NULL, cmd_str, NULL, NULL, FALSE, 0, NULL, NULL, &startinfo, &procinfo);
        CloseHandle(procinfo.hProcess);
        CloseHandle(procinfo.hThread);
    }
    free(cnf_path);
    free(cwd_path);
    return (EXIT_SUCCESS);
}

cmd 文件内容:

1
2
3
4
5
6
# Author : Klesh Wong
# Blog : http://kleshwong.com
# this is totally freeware.

# "c:Program FilesTortoiseSVNbinTortoiseMerge.exe" /theirs:%s /base:%s
"c:\Program Files\Vim\vim72\gvim.exe" -d %s %s

压缩包:

下载后解压到某一目录

1.编辑目录下面的 cmd 文件,指定文件比较程序的调用格式,

2.在 dreamweaver 的“首选参数”,右边点击“文件比较”,“浏览”定位到 dreamweaver_diff_adapter.exe 确定

3.在“文件面板”,先点击一个文件,再按 ctrl 点击另一个要比较的文件,右击选择“比较本地文件”,如果文件比较软件正常弹出即说明运行正常,否则请检查文件比较程序是否能正常运行,调用格式是否正确。

推荐使用 gvim 或者 tortoise svn 的比较功能