假期甚为单调,回想起以前做的远程文件管理,手又痒痒,打算继续做这个东西。原来的那个代码因为本本被格所以丢了,重新写一个吧,试着放弃WINSOCK控件来写。
先挖个坑,占个地。。。
请多关注!~
7月23日,控制端主界面制作完毕,控制端初始化制作完毕,修改配置部分制作完毕
7月24日,主机上线部分制作完毕。
7月29日,文件管理完成30%。。。(好几天没更新了,这个纯属凑数。。。)
8月5日,好久没有做这个,忙别的去了。晚上断网了,就写了一些,做的还是文件部分,基本已经成型。发个截个图
8月20日,这几天光跟哥们打DOTA了,也没顾上这个东西。。。修正了WINSOCK控件缓冲区只有8KB的问题,郁闷了一个星期,最后还是用了个自己也不太满意的方案,但是效果还是不错滴。文件管理基本完成了。贴出来一段删除文件夹的代码吧,使用了遍历依次删除,可以删除文件夹中带有 . (一个点)的非法文件夹,别小看这个,我就喜欢把一些东西放到这类文件夹中,文件夹名字改成dir.....(后面一串点),直接打开会报错。
8月26日,文件管理完成了。粗心大意的光出错。还有就是我用使用byte数组来接受数据,然后按需要转换成string类型,接收到的bytesTotal这个变量跟len(string)是不一样滴,一个中文字符时两个字节!做了一些小细节的修改。上张图吧。
10月9日,又这么久没有动。。。开学了,上课忙啊。把文件(文件夹)属性设置那部分重新做了一下。比如给某个文件添加只读属性的时候,不能光用 SetFileAttributes 文件路径,FILE_ATTRIBUTE_READONLY 来设置,这样子目标文件就会是只有只读属性,原来的就覆盖了。后来随手就写上了+来连接,但是这也不对啊。经研究,用or来运算原始属性值和新属性,这样子就是添加,那去掉呢?想都没想就用了xor。。。后来发现纯粹大脑发热,经研究用了这种方式:原始属性值 and (not 新属性值),经过这个运算就是新属性值。下面贴出来代码。
11月28日,前段时间在忙考试,都考了8科了。。。这个软件更新的就是重新做了通信协议。原来协议用的是字符串匹配的方式,比如我发送字符串001#,意思就是要求服务端发送计算机信息。后来学习了汇编和硬件数据传输,编程的时候了解了部分windows的特性,想到了一个问题,字符串匹配的话,比如 if strCMD="001#" then 这个简单的判断,需要执行至少四次判断,已字节的方式一一匹配才能返回结果。后来想到了如果我只是用byte的001来表示1号指令请求服务端的计算机信息,那执行的速度会快很多。于是,重新写了通信协议,就是把原来字符串全部换成了byte的值。但是这个时候发送数据的时候就不能用winsock.send strData的方式了,因为byte的0就是NULLCHAR,是字符串的结尾标志。所以发送数据要用byte数据的方式放松。我贴出来我用到的协议,很随意,没有工业级标准那样的高位和低位之分,就是从小到大排的,以后要是有这些项目的话再好好弄通信协议吧,这个软件就是学习的产品。
8月5日截图:
8月26日截图:
8月20日贴代码,删除文件夹:
Public Function DelDir(ByVal DTarget As String) As Boolean '老早以前写的Function,又被我翻出来了
Dim D_WFD As WIN32_FIND_DATA
Dim hW As Long
Dim TempFPath As String
Dim TempFName As String
Dim DelFLst As New Collection
Dim DelDLst As New Collection
If Right(DTarget, 1) <> "\" Then
TempFPath = DTarget & "\"
Else
TempFPath = DTarget
End If
hW = FindFirstFile(TempFPath & "*.*", D_WFD)
If hW = INVALID_HANDLE_VALUE Then DelDir = False: GoTo Ext
Do
TempFName = Left(D_WFD.cFileName, InStr(D_WFD.cFileName, vbNullChar) - 1)
If (D_WFD.dwFileAttributes And vbDirectory) Then
If TempFName <> "." And TempFName <> ".." Then
If Right(TempFName, 1) = "." Then TempFName = TempFName & ".\" '就这一行,就可以删除文件夹中带 . 的非法文件夹
DelDir TempFPath & TempFName
End If
Else
SetFileAttributes TempFPath & TempFName, FILE_ATTRIBUTE_ARCHIVE '为了防止有只读或者系统属性影响
If DeleteFile(TempFPath & TempFName) = 0 Then DelDir = False: GoTo Ext '使用了API
End If
DoEvents
Loop While FindNextFile(hW, D_WFD)
FindClose hW
SetFileAttributes DTarget, FILE_ATTRIBUTE_ARCHIVE
If RemoveDirectory(DTarget) = 0 Then DelDir = False: GoTo Ext '使用了API
DelDir = True
Ext:
Set DelFLst = Nothing
Set DelDLst = Nothing '传说中的能释放内存
End Function
----------很早以前写的,感觉这里用了Collection虽然方便,但是影响了速度。。。如果谁看着不顺眼可以改成用string数组。
10月9日贴代码,设置文件/文件夹属性部分的代码:
Public Sub SetFileAttrib(ByVal strPath As String)
Dim fWFD As WIN32_FIND_DATA
Dim hFind As Long
Dim strLen As Integer
Dim strFile As String
'Debug.Print strPath
strFile = Left$(strPath, Len(strPath) - 4)
hFind = FindFirstFile(strFile, fWFD)
If hFind <> INVALID_HANDLE_VALUE Then
strLen = Len(strPath)
If Mid$(strPath, strLen - 3, 1) = "Y" Then '存档就是Y,没有存档属性就是N
fWFD.dwFileAttributes = fWFD.dwFileAttributes Or FILE_ATTRIBUTE_ARCHIVE
SetFileAttributes strFile, fWFD.dwFileAttributes
Else
fWFD.dwFileAttributes = fWFD.dwFileAttributes And (Not FILE_ATTRIBUTE_ARCHIVE)
SetFileAttributes strFile, fWFD.dwFileAttributes
End If
If Mid$(strPath, strLen - 2, 1) = "Y" Then '只读
fWFD.dwFileAttributes = fWFD.dwFileAttributes Or FILE_ATTRIBUTE_READONLY
SetFileAttributes strFile, fWFD.dwFileAttributes
Else
fWFD.dwFileAttributes = fWFD.dwFileAttributes And (Not FILE_ATTRIBUTE_READONLY)
SetFileAttributes strFile, fWFD.dwFileAttributes
End If
If Mid$(strPath, strLen - 1, 1) = "Y" Then '隐藏
fWFD.dwFileAttributes = fWFD.dwFileAttributes Or FILE_ATTRIBUTE_HIDDEN
SetFileAttributes strFile, fWFD.dwFileAttributes
Else
fWFD.dwFileAttributes = fWFD.dwFileAttributes And (Not FILE_ATTRIBUTE_HIDDEN)
SetFileAttributes strFile, fWFD.dwFileAttributes
End If
If Mid$(strPath, strLen, 1) = "Y" Then '系统
fWFD.dwFileAttributes = fWFD.dwFileAttributes Or FILE_ATTRIBUTE_SYSTEM
SetFileAttributes strFile, fWFD.dwFileAttributes
Else
fWFD.dwFileAttributes = fWFD.dwFileAttributes And (Not FILE_ATTRIBUTE_SYSTEM)
SetFileAttributes strFile, fWFD.dwFileAttributes
End If
End If
sckSendData "008*"
End Sub
11月28日贴已完成的通信协议:
+===========================================================================
Client发送(Server接收):
255 要求你下线
000 连接OK,请发送密码
001+Y/N 密码是否通过
002 请求驱动器
003+Path 请求目录列表
004 接收到上一个数据包,继续下一个数据包
005+Sourse|Target 复制文件
006+Path 删除
007+Path+N/H 运行文件 H隐藏 N正常
008+Path 文件属性
009+Path+Attrib(存档.只读.隐藏.系统)Y/N
010+Sourse|Target 重命名/剪切文件
011+Sourse|Target 克隆时间
015#+File 请求下载文件
015* 接受完毕上一个数据包,继续下一个数据包
016#+File 请求上传文件
017*+Data 上传文件到服务端,发送文件数据(未完毕)
017#+Data 上传文件到服务端,发送文件数据(最后一个数据包)
+==========================================================================
Server发送(Client接收):
255 我要下线
000+Pass 发送密码
001+Info 发送本机信息 IP|计算机名|内存|OS
002+Driver 发送驱动器 盘符+类型|
003+Dir 发送文件夹信息 name|type|大小|最后修改日期|| 0是文件夹 1是文件(最后一个包)
004 发送文件夹信息(未完毕)
005+Y/N 复制是否成功
006+Y/N 删除成功
007+PID 返回PID
008+Path|AccessTime|CreateTime|ModifyTime|Size|Attrib(存档.隐藏.只读.系统)Y/N
009+Y/N 设置属性是否成功
010+Y/N 重命名/剪切是否成功
011+Y/N 克隆时间是否成功
015*+Data 客户端请求下载文件,发送文件数据(未完毕)
015#+Data 客户端请求下载文件,发送文件数据(最后一个数据包)
===========================================================================
lemondian@163.com