Cygwin是一个用于在Windows上模拟Linux环境的软件,由于工作上的需要,我要使用它,至于为什么用它,我在这里不做过多的解释,本文的目的,旨在于解决Cygwin安装上的问题。
原始的安装Cygwin的方法有两种(官方的方法):
1.远程下载安装,需要访问网络。
2.本地安装,前提是在本地要有安装文件,获取安装文件的方法有两种,一种就是通过远程下载下来,保存在本地,第二种就是订购其ISO光盘。
显然,对于国内大多数用户来说,订购ISO光盘,不是上上之选,那只有考虑从网上下了。
可是问题来了,虽然Cygwin的官网上提供了众多的镜像,但不知是国内的网络不行还是怎么回事,下载奇慢,好像回到了拨号时代,汗。。。。慢还不要紧,下得不掉链子的算你幸运。
那怎么办?正规方法是不行了,还好有些好心的网友,把自己下载下来的安装文件共享了出来。大家可以在网上搜索一下,“Cygwin 本地安装”,“Cygwin 安装包”或“Cygwin ISO”。哈哈,是不是有戏?生命在于奉献!,多亏了有这么多热心的网友:)
对于大多数人来说,上面的快速安装方法已经足够了。
可是本人偏爱DIY,所以本人研究了一下,Cygwin的官方说明,找到了另一种方法(我没这么好的网络,可不能像有些安心的网友那样自己通过安装程序提供的方法安静的等待)。在这里与大家分享。
1.下载官网最新安装程序:下载下来的文件最好保存到一个目录下,因为Cygwin安装文件中众多,后面方便操作,比如我下载到了X:/Cygwin。
2.运行,下一步,诶,看图吧:

没什么好说的,想看的就看,不想看的,就下一步。

选择"Install from Internate...",你不是说不用官方的方法下载吗?别问,后面你就会知道,下一步。

随便指定个安装目录先,但不要再设成X:/Cygwin,以免搞乱。其它默认,下一步。

真烦,又要指定,这回我们指成我们的下载目录,X:/Cygwin,下一步。

指定代理,我这里不需要,下一步。

嗯,去更新镜像外列表,等它完成

选一个镜像吧,随便选(我这里选:http://mirrors.xmission.com),下下步。

等待。。。

好,到此打住了,我们去X:/Cygwin下找个文件,Setup.ini,这个文件一般会在X:/Cygwin的子目录下,其实就是以刚才选的镜像网为名的目录(http%3a%2f%2fmirrors.xmission.com%2fcygwin)。找到后,点取消。
3.梦里寻他千百渡,其实就为找到Setup.ini。其实还有方法找到Setup.ini你可以自己去想想,我这里就不说了。
4.记住目录名,"http://mirrors.xmission.com/cygwin"
5.下载我提供的项目“CygwinStorm”(Java),用eclipse打开,然后把刚才那个Setup.ini拷贝到项目根目录,覆盖原来的Setup.ini。
6.打开项目里的org.cygwin.CygwinStorm,改如下一处:
urlPath = "http://www.cygwin.cn/pub/";
为
urlPath = "http://mirrors.xmission.com/cygwin";
运行。
7.刷新项目,打开“result.log”,如果没什么错误的话,一切OK。打开“install.log”,看到了吧,这些是Cygwin安装文件在镜像服务器上的路径,快用下载工具批量下载吧。顺便提醒一句,如果你是用讯雷下载的话,讯雷的一次批量添加上限是201条,还有默认讯雷不监控.bz2为后缀的文件。好了我把文件下载到,“X:/Download/Cygwin”,记住。
8.全都下载完后,是不是就可以安装了,别急,还有最后一步,改
isExtract = true;
downloadPath = "X:/Downloads/cygwin/2.573.2.2/";
为
isExtract = false;
downloadPath = "X:/Download/Cygwin";
运行。
9.好了,打开项目目录下的release目录。是不是所有的文件都在这里面了,用Cygwin安装程序安装吧。出于安全我没有删除原下载目录下的文件,所以记得删除“X:/Download/Cygwin”。
至此,你已经有了一份Cygwin安装文件,把保存好,待以后安装时候用吧。

/**

*

*/

package org.cygwin;


import java.io.*;


/**

* @author Aaron

* @since JDK 1.6.0

*

*/

public class CygwinStorm {

protected static boolean isExtract = true;

protected static String urlPath = "http://www.cygwin.cn/pub/";//$NON-NLS-1$

protected static String destPath = "./";//$NON-NLS-1$

protected static String downloadPath = "X:/Downloads/cygwin/2.573.2.2/"; //$NON-NLS-1$


/*

* @param args

* @throws FileNotFoundException

*/

public static void main(String[] args) throws IOException {

String key0 = "["; //$NON-NLS-1$

String key1 = "install:"; //$NON-NLS-1$

String key2 = "source:"; //$NON-NLS-1$


File input = new File("./setup.ini"); //$NON-NLS-1$

BufferedReader reader = new BufferedReader(new FileReader(input));

BufferedWriter writer1 = null;

BufferedWriter writer2 = null;

BufferedWriter writer3 = null;

if (isExtract) {

File install = new File("./install.log"); //$NON-NLS-1$

File source = new File("./source.log"); //$NON-NLS-1$

writer1 = new BufferedWriter(new FileWriter(install));

writer2 = new BufferedWriter(new FileWriter(source));

}


File result = new File("./result.log"); //$NON-NLS-1$

writer3 = new BufferedWriter(new FileWriter(result));


String line = null;

int count = 0;

while ((line = reader.readLine()) != null) {

if (line.startsWith(key0) && !line.startsWith("[curr]")) { //$NON-NLS-1$

count = 1;

}

switch (count) {

case 0 : {

if (line.startsWith(key1)) {

line = extract(line, writer3);

makeDir(line, writer3);

storeURL(line, writer1);

} else if (line.startsWith(key2)) {

line = extract(line, writer3);

makeDir(line, writer3);

storeURL(line, writer2);

}

break;

}

case 1 :

case 2 :

case 3 :

count++;

break;

case 4 :

count = 0;

break;

}

}

reader.close();

if (isExtract) {

writer1.close();

writer2.close();

}

writer3.write("Job completed!"); //$NON-NLS-1$

writer3.close();

}


protected static String extract(String line, BufferedWriter bw) throws IOException {

String key3 = ".bz2";//$NON-NLS-1$

String key4 = "release";//$NON-NLS-1$

String key5 = " ";//$NON-NLS-1$

int beginIndex = line.indexOf(key4);

int endIndex = line.indexOf(key5, beginIndex);

if (line.contains(key3))

return line.substring(beginIndex, endIndex);

bw.newLine();

bw.newLine();

bw.newLine();

bw.write("[extract exception]:" + line); //$NON-NLS-1$

bw.newLine();

bw.newLine();

bw.newLine();

return line;

}


protected static void storeURL(String line, BufferedWriter bw) throws IOException {

if (bw != null) {

String str = urlPath + line;

bw.write(str);

bw.newLine();

}

}


protected static void makeDir(String line, BufferedWriter bw) throws IOException {

String str = destPath + line;

File file = new File(str);

File dir = file.getParentFile();

if (!dir.exists()) {

dir.mkdirs();

// bw.write("[make dir]:" + dir); //$NON-NLS-1$

// bw.newLine();

}

if (!file.exists())

moveFile(file, bw);

}


protected static void moveFile(File file, BufferedWriter bw) throws IOException {

String oldPath = downloadPath + file.getName();

String newPath = file.getAbsolutePath();

copyFile(oldPath, newPath);

if (file.exists()) {

bw.write("[move file]:" + oldPath + "[to]:" + newPath); //$NON-NLS-1$ //$NON-NLS-2$

bw.newLine();

}

}


protected static void copyFile(String oldPath, String newPath) {

try {

int bytesum = 0;

int byteread = 0;

File oldfile = new File(oldPath);

if (oldfile.exists()) {

InputStream inStream = new FileInputStream(oldPath);

FileOutputStream fs = new FileOutputStream(newPath);

byte[] buffer = new byte[1444];

while ((byteread = inStream.read(buffer)) != -1) {

bytesum += byteread;

fs.write(buffer, 0, byteread);

}

inStream.close();

}

} catch (Exception e) {

System.out.println("Copy file occur error." + oldPath); //$NON-NLS-1$

e.printStackTrace();

}

}

}