帐前卒专栏

code, software architect, articles and novels.
代码,软件架构,博客和小说

今天的工作有陷入停滞状态。强烈要求Mentor转域。Mentor同意,现在强烈要求Tony给我转域。但Tony还未给答复。看来明天还要ping.

今天看了看函数异步调用,看了下过去写的论文,又写了点英文简介。有问了问学长们保研的情况。不知道自己走的这条路是否顺利。下午发了封信给mentor想要点其他的
小任务做,否则真是闲。

前几日被别人在blog中点到。

大概是要回答最懊悔的时候,最幸福的时候,理想什么的东东。

我想自己暂时还没有最XX的时候…而且一直也不认为这些时候也有比较的可能性。 至于理想大概暂时是SA。以后或许会变,或许…但是谁也不好说。

昨日点点染发烫发了。童梓说看着一个单纯的小孩变成…我也没有语言了。不过点点做事情…总是给人新奇的感觉。看了照片以后再做评论吧。

昨日聊了一晚上。发现学弟学妹们都认学了。呵呵。nuonuo当上了班长,不过压力是够大的。希望她能推掉。说实话我一直认为当班长是吃力不讨好的工作。所以我才当部
长的。

下载服务器端的文件可以使用最直接的超链接。超链接的路径可以是绝对路径,也可以是相对路径。但是有时候因为浏览器的缘故,需要点击右键save as才可以下载。

如果希望点击button才下载文件的话使用Response方法。

具体方法是:

Response.TransmitFile(filefullname);//不知道能不能使用相对路径。

Response.Flush();

Response.Close();//这两句有时候可以不写。

但是如果想当客户端下载完毕后,服务器端将文件删除。

那以上这两句必须写了。

具体的代码如下:

FileInfo f = new FileInfo(filefullname);

if(f.Exist)

{

Response.TransmitFile(filefullname);

Response.Flush();

Response.Close();

f.Delete();

}

本次示例主要实现:
1.压缩文件夹及其下文件
2.压缩文件夹下文件
3.压缩文件夹及其下文件为rar 还是 zip
4.解压缩
5.加密压缩及解加密压缩
-----------
示例代码如下:
protected void Button1_Click(object sender, EventArgs e)
{
string strtxtPath = “C://freezip//free.txt”;
string strzipPath = “C://freezip//free.zip”;
System.Diagnostics.Process Process1 = new System.Diagnostics.Process();
Process1.StartInfo.FileName = “Winrar.exe”;
Process1.StartInfo.CreateNoWindow = true;

//// 1
////压缩c:/freezip/free.txt(即文件夹及其下文件freezip/free.txt)
////到c:/freezip/free.rar
//strzipPath = “C://freezip//free”;//默认压缩方式为 .rar
//Process1.StartInfo.Arguments = " a -r " + strzipPath + " " + strtxtPath;

//// 2
////压缩c:/freezip/free.txt(即文件夹及其下文件freezip/free.txt)
////到c:/freezip/free.rar
//strzipPath = “C://freezip//free”;//设置压缩方式为 .zip
//Process1.StartInfo.Arguments = " a -afzip " + strzipPath + " " + strtxtPath;

//// 3
////压缩c:/freezip/free.txt(即文件夹及其下文件freezip/free.txt)
////到c:/freezip/free.zip  直接设定为free.zip
//Process1.StartInfo.Arguments = " a -r “+strzipPath+” " + strtxtPath ;

//// 4
////搬迁压缩c:/freezip/free.txt(即文件夹及其下文件freezip/free.txt)
////到c:/freezip/free.rar 压缩后 原文件将不存在
//Process1.StartInfo.Arguments = " m " + strzipPath + " " + strtxtPath;

//// 5
////压缩c:/freezip/下的free.txt(即文件free.txt)
////到c:/freezip/free.zip  直接设定为free.zip 只有文件 而没有文件夹
//Process1.StartInfo.Arguments = " a -ep " + strzipPath + " " + strtxtPath;

//// 6
////解压缩c:/freezip/free.rar
////到 c:/freezip/
//strtxtPath = “c://freezip//”;
//Process1.StartInfo.Arguments = " x " + strzipPath + " " + strtxtPath;

//// 7
////加密压缩c:/freezip/free.txt(即文件夹及其下文件freezip/free.txt)
////到c:/freezip/free.zip  密码为123456 注意参数间不要空格
//Process1.StartInfo.Arguments = " a -p123456 " + strzipPath + " " +
strtxtPath;

//// 8
////解压缩加密的c:/freezip/free.rar
////到 c:/freezip/   密码为123456 注意参数间不要空格
//strtxtPath = “c://freezip//”;
//Process1.StartInfo.Arguments = " x -p123456 " + strzipPath + " " +
strtxtPath;
//// 9
////-o+ 覆盖 已经存在的文件
//// -o- 不覆盖 已经存在的文件
//strtxtPath = “c://freezip//”;
//Process1.StartInfo.Arguments = " x -o+ " + strzipPath + " " + strtxtPath;

////10
//// 只从指定的zip中
//// 解压出free1.txt
//// 到指定路径下
//// 压缩包中的其他文件 不予解压
//strtxtPath = “c://freezip//”;
//Process1.StartInfo.Arguments = " x " + strzipPath + " " +" free1.txt" + " "

  • strtxtPath;

//// 11
//// 通过 -y 对所有询问回应为"是" 以便 即便发生错误 也不弹出WINRAR的窗口
//// -cl 转换文件名为小写字母
//strtxtPath = “c://freezip//”;
//Process1.StartInfo.Arguments = " t -y -cl " + strzipPath + " " + "
free1.txt";

Process1.Start();
if (Process1.HasExited)
{
int iExitCode = Process1.ExitCode;
if (iExitCode == 0)
{
Response.Write(iExitCode.ToString() + " 正常完成");
}
else
{
Response.Write(iExitCode.ToString() + " 有错完成");
}
}
}

在javascript中要调用c#的变量(在后台的)

<script…>

var a = “<%=aa%>”//这里aa是后台c#中的变量,这个变量必须是protected访问级及以上才可以

顺序是先调用PageLoad,然后再初始化页面html。所以页面的html要想动态的控制也可以用<%=变量%>,

当然我还见过一种使用方式是<%#DataBinder(Container.DataItem,“绑定名”)%>,这里要注意大小写(我这个也不一定是正确的)。好
像这种用法只是在GridView中才使用。

c#要使用javascript的变量,只需要写一个

//name的值可以自己取

然后在javascript脚本中写:document.all.ss.value = 变量名;

这里的变量名可以是script生成的结果变量,而ss是刚才中的name。

然后就document.form1.submit();  //这里的form1是所在的form

这样点击button后这个form就被提交到相应的页面,然后在那个页面的后台用c#写:

Resquest.QueryString(“ss”)--------就是刚才的的name…这样就得到了其值。

当然如果javacript中想传一个过来,最好将那个对象解析为一个一个字符串的值和合体。。

然后使用string的split()方法来重新构造那个对象。

动态的创建矩形直接使用var divs = document.createElement(“div”);

然后使用document.body.appendChild(divs);   如果这句不写是不能显示Div的。

还可以为这个变量(div)再进行属性的赋值如:

divs.id = 1;//设置id

divs.style.filter = “alpha(opacity=50)”;//设置透明度

设置这个变量的方法可以使用如下语句

divs.onmousedown = function()
{
InitDrag();//这个方法必须在javascript脚本中有定义。这样还可以传参进这个函数
};

这个矩形的就这样创建完毕。同时如果使用拖拽的话可以对onmousedown,onmouseup,onmousemove这几个函数进行定义。当然要改变这个di
v的属性值的时候,要先获得这个div的对象,使用document.getElementByID()方法,参数是刚才设置的divs的id值。如果要判断鼠标点击
的是哪一个div就可以使用var rect = event.srcElement;这个属性就是触发事件的那个矩形。

这两句是在其他网站上看到的,使用的是鼠标的相对位置来设置当前的div所在的位置。

var posLeft= document.body.scrollLeft+event.x-x;
var posTop= document.body.scrollTop+event.y-y;

下面说说mouse触发event事件后,各个坐标值是什么意思:

x,就是clientX,大概是相对浏览器窗口的位置

offsetX就是相对与这个div的父节点的位置

screenX就是相对与屏幕的位置(也可以认为是真实的位置)

但是一直没有弄懂scrollLeft是什么。

这里一定要注意,javascript是区分大小写的,写错了有可能编译通过,但是运行时报出各种各样的错误。注意浏览器报出的错误往往不是真实的错误。发生错误的地
方往往在所报行数的上面。

在c#中写javascript脚本

如果声明javascript变量使用var temp;//temp是变量名称,当然这里不使用var关键字也没有问题

在javascript中声明函数使用function关键字。

如果一个字符串var s = “gg;ee;ww”;

var ss = s.split(‘;’);//这样ss就变成了一个数组其ss[0]“gg” ss[1]“ee” ss[2]==“ww”

当然也可以使用var ss=new Array;来定义一个数组

在数组中,可以对任意位置赋值。比如刚才new 完数组后,可以 ss[10]=“xx”

遍历javascript数组的时候可以使用for( i in ss)   i 为index,ss 为
Array。当这个数组中的元素为null时,自动跳过。要删除数组中的元素只要使用delete ss[i]
即可。这样删除后,ss中元素不会自动前移。依旧保持固有的下标。

今天终于在其他热情的interns的带领下,去玩了下xbox。比想象中的简单。因为机器人的AI都做得很低。看来是照顾新手。画面也非常的逼真。手柄也不停的振动
。不过我玩了两个小时实在感觉不能再玩下去,于是就离开了。

终于玩上xbox了。。。

不知道还有什么好玩的。。。

当png图片导入到程序中创建bitmap中时,再将此bitmap对象转为byte数组的时候,就会发现同时100*100的png,得到的byte数组可能是不同
的大小。这是要将byte数组按照ImageFormat.bitmap的方式重新构造新的bitmap,然后在将此bitmap转为byte数组,就会发现是byt
e数组是一致大小的。

同时要注意bmp图片转为byte数组后,0-53个byte是记载了bmp的信息。而且相同width和height的bmp图片前54位是一致的。利用这一点我们
可以生成临时的bitmap图像。但是不同的 width和height的bmp图片前54位是不太一样的。

bitmap对象转为byte数组的代码


MemoryStream ms = new MemoryStream ();

bt.Save(ms, format);

return ms.ToArray();

这里的format即为ImageFormat的一个属性。

byte数组转换为bitmap的代码


MemoryStream ms = new MemoryStream(b);

Bitmap bt = new Bitmap(ms);

return bt;

bitmap转为byte数组后,从第55位开始每4位代表一个Color对象。

但是rgba排列顺序是bgra即为byte[54]—b,byte[55]—g,byte[56]—r,byte[57]—a

线程的建立:(不同于java的是不用再继承Thread类)


TcpClient tc = tListener.AcceptTcpClient();

CThreadServer ctserver = new CThreadServer(tc);

Thread t = new Thread( new ThreadStart(ctserver.AcceptImageFile));

t.IsBackground = true ;

t.Start();

线程池的建立


TcpClient tc = tListener.AcceptTcpClient();

CThreadServer ctserver = new CThreadServer(tc);
//
Thread t = new Thread(new ThreadStart(ctserver.AcceptImageFile));
//
t.IsBackground = true;
//
t.Start();


ThreadPool.QueueUserWorkItem( new WaitCallback(ctserver.AcceptImageFile));

但这里的AcceptImageFile与线程建立中的AcceptImageFile有所不同

在线程建立中为AcceptImageFile();

在线程池建立中为AcceptImageFile(Object o);这里的Object o是必须要加入的。

pictureName    version   status

A                             1              0

A                             2               0

A                              1              1

B                             1               0

B                            1                1

B                             0               1

希望得到picture中相同pictureName的最大version中的status为0的结果

Select distinct pictureName from picture---------得到A B

Select pictureName,max(version) as v from picture where pictureName in (Select
distinct pictureName from picture) Group by pictureName--------得到 A   2   与
B       1

然后SELECT picture.picturename,picture.version, picture.status FROM
picture,(SELECT pictureName,MAX(version) AS v FROM picture WHERE pictureName
IN (SELECT DISTINCT pictureName FROM picture) GROUP BY pictureName) AS picTemp
WHERE picture.version=picTemp.v AND picture.picturename=pictTemp.picturename
AND status=0

这里并没有考虑效率问题…

0%