[转载]C# 谈谈Interface和通过Interface传递web页面数据

mikel阅读(847)

[转载]C# 谈谈Interface和通过Interface传递web页面数据 – spring yang – 博客园.

接口:描述可属于任何类或结构的一组相关功能,通过interface关键字来声明;
接口只包含方法、委托或事件和属性的签名(接口包含的成员)、不能包含字段(因为字段是包含数据的)。方法的实现是“继承”接口的类中完成的;
接口可以包含的成员的访问修饰符只能且默认为public;
一个接口可以从一个或多个基接口继承;
接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员;
当基类型列表包含基类和接口时,基类必须是列表中的第一项;
实现接口的类可以显式实现该接口的成员,显示实现的成员不能通过类实例访问,而只能通过接口实例访问;
类和结构可以按照类继承基类或结构的类似方式继承接口;但注意:
类或结构可继承多个接口;
类或结构继承接口时,仅继承方法名称和签名,因为接口本身不包含实现;
接口和接口成员是抽象的(但不用写出abstract关键字);接口不提供默认实现;

接口是一种规划(为你定义出一系列的规则和任务,但不去实现它);

先看一个实例:

interface IPoint
{
// Property signatures:
int x
{
get;
set;
}

int y
{
get;
set;
}
}

class Point : IPoint
{
// Fields:
private int _x;
private int _y;

// Constructor:
public Point(int x, int y)
{
_x = x;
_y = y;
}

// Property implementation:
public int x
{
get
{
return _x;
}

set
{
_x = value;
}
}

public int y
{
get
{
return _y;
}
set
{
_y = value;
}
}
}

class MainClass
{
static void PrintPoint(IPoint p)
{
Console.WriteLine("x={0}, y={1}", p.x, p.y);
}

static void Main()
{
Point p = new Point(2, 3);
Console.Write("My Point: ");
PrintPoint(p);
}
}
// Output: My Point: x=2, y=3

上面是一个简单的接口实现,如果在一个Web网页上的.CS文件中继承一个接口,如下:

先定义接口:

<body>
    <form id="form1" runat="server">
    <div>
    
        <table class="style1">
            <tr>
                <td class="style2">
                    <asp:Label ID="lblUsername" runat="server" Text="Username"></asp:Label>
                </td>
                <td>
                    <asp:TextBox ID="txtUserName" runat="server"></asp:TextBox>
                </td>
            </tr>
            <tr>
                <td class="style2">
                    <asp:Label ID="lblPassWord" runat="server" Text="PassWord"></asp:Label>
                </td>
                <td>
                    <asp:TextBox ID="txtPassWord" runat="server"></asp:TextBox>
                </td>
            </tr>
            <tr>
                <td class="style2">
                     </td>
                <td>
                    <asp:Button ID="btnSubmit" runat="server" onclick="btnSubmit_Click" 
                        Text="Submit" />
                </td>
            </tr>
            <tr>
                <td class="style2">
                     </td>
                <td>
                    <asp:Label ID="lblMessage" runat="server"></asp:Label>
                </td>
            </tr>
        </table>
    
    </div>
    </form>
</body>

[原创]JQuery动态添加Select的Option选项

mikel阅读(1228)

最近做网站需要随时添加商品分类信息,然后默认选中添加的分类信息,为了避免重复获取服务器分类信息,于是需要利用JQuery添加Select组件的Option选项,实例代码如下:

//异步保存分类信息
function SaveCategory() {
    $.post("/GoodsCategory/AjaxSave", { categoryName: $("#CategoryName").val(), parentID: $("#parentID").val() }, function(data) {
        if (data) {
            alert("保存成功!");
            //如果为一级分类,添加到分类中
            if (data.ParentID == 1) {
                var str = "<option value='" + data.Identifier + "'>&nbsp;&nbsp;" + data.CategoryName + "</option>";
                $("select#Category_ID").append(str);
            } else {

                //添加新的分类到分类选择中,并默认选中
                $("select#Category_ID option").each(function(obj) {

                    if (data.ParentID == $(this).val()) {
                        var span = "";
                        for (i = 2; i < data.Cate_Level * 1; i++)
                            span = span + "&nbsp;";
                        var str = "<option value='" + data.Identifier + "'>" + span + data.CategoryName + "</option>";
                        $(str).insertAfter(this);
                    }
                });
            }
            //设置选中值为当前添加的值
            $("select#Category_ID").val(data.Identifier);
            tb_remove();

        } else {
            alert("保存分类失败!");
        }

    }, "json");


}

[转载]AndroidContacts操作系列之 查看底层联系人表结构

mikel阅读(946)

[转载]AndroidContacts操作系列之 查看底层联系人表结构 – duicky – 博客园.

对于很多想做通讯录,或者很多想对系统通讯录操作的童鞋们肯定都会遇到个问题,系统通讯录操作很麻烦,我能不能直接看看底层联系人表结构呢 ?

如果可以看到的话,那一定能提高相关操作的准确性和效率吧。

不多说,直接把步骤给列出来:

1、  打开Eclipse,运行模拟器

2、  调出 Android 中的 File Explorer(Windows—>Show View -> Other -> Android – > File Explorer)

3、  打开File Explorer , 选择 Data->Data->com.android.providers.contacts->databases, 此时你能看到一个数据库:contacts2.db。

4、  点击File Explorer 右上角的 “ <- ” 导出键,把contacts2.db到处到 自定义位置。我这导出到 D盘的根目录下 :

导出键

保存文件

5、  下载SQLite 管理工具SQLiteDev344。 大家可以随便百度google搜搜。我是从这下载的(http://www.cr173.com/soft/12286.html

6、  正常安装,打开如图:

7、  点击“+数据库”、或者 数据库->注册数据库

8、  选择你导出的数据库。 数据库别名能随便取:

9、  打开左边菜单,双击Contacts2数据库。

10、              选择表,你就能看到Contacts 的所有表都在你手中了。

11、              双击data表,查看表的结构

12、              点击 数据,查看表中内容

13、恭喜到此为止,你能查看Contacts中的任意表结构和数据了。

14、接下来有时间还准备发表些关于 联系人操作 的文章 , 有问题可留言一起讨论 。

[转载]QQ在线状态自定义图标

mikel阅读(1608)

[转载]李伟的博客 » QQ在线状态自定义图标.

今天做公司的企业网站要加上QQ在线客服,可是官方提供的几种样式和网站特别不协调,所以就在研究怎么自定义图标。找了很长时间的资料,也试了很多遍,还是不行,后来在一博友那里找到了答案,特分享给大家,如果有用就免费收藏吧!!!
我们使用自定义图片的时候怎么来根据不同的状态显示不同的图片呢,今天看了下QQ提供的图片,发现通过判断QQ提供的图片的宽度可以得到qq的状态。给我发消息这个是QQ提供的图片地址SRC=http://wpa.qq.com/pa?p=1:28171291:4,p的最后一个参数要是4才可以判断,提供的别的图片,大小宽高都是一样的不能判断。
下边是示例代码,测试的时候可以换成自己的QQ,在线的时候显示QQ的logo,不在线显示百度的logo,





李伟的博客
<script type="text/javascript">// <!&#91;CDATA&#91;
 function showQQ()
 {
var qq=document.getElementById("qq")
if(qq.width<20)
{
    qq.src="http://piao.hunbohui.com/qq11.gif"
    qq.alt="QQ不在线"
}
else
{
    qq.src="http://piao.hunbohui.com/qq1.gif"
    qq.alt="罗威婚纱为您服务!"
}
var qq1=document.getElementById("qq1")
if(qq1.width<20)
{
    qq1.src="http://piao.hunbohui.com/qq11.gif"
    qq1.alt="QQ不在线"
}
else
{
    qq1.src="http://piao.hunbohui.com/qq1.gif"
    qq1.alt="罗威婚纱为您服务!"
}
var qq2=document.getElementById("qq2")
if(qq2.width<20)
{
    qq2.src="http://piao.hunbohui.com/qq11.gif"
    qq2.alt="QQ不在线"
}
else
{
    qq2.src="http://piao.hunbohui.com/qq1.gif"
    qq2.alt="罗威婚纱为您服务!"
}
var qq3=document.getElementById("qq3")
if(qq3.width<20) {     qq3.src="http://piao.hunbohui.com/qq11.gif"     qq3.alt="QQ不在线" } else {     qq3.src="http://piao.hunbohui.com/qq1.gif"     qq3.alt="罗威婚纱为您服务!" } }
// &#93;&#93;></script>


<a href="http://wpa.qq.com/msgrd?V=1&amp;Uin=610477649&amp;Exe=QQ&amp;Site=im.qq.com&amp;Menu=No" target="blank">
<img id="qq" src="http://wpa.qq.com/pa?p=1:610477649:4" border="0" alt="给我发消息" /></a>

<a href="http://wpa.qq.com/msgrd?V=1&amp;Uin=595312709&amp;Exe=QQ&amp;Site=im.qq.com&amp;Menu=No" target="blank">
<img id="qq1" src="http://wpa.qq.com/pa?p=1:595312709:4" border="0" alt="给我发消息" /></a>

<a href="http://wpa.qq.com/msgrd?V=1&amp;Uin=1351962303&amp;Exe=QQ&amp;Site=im.qq.com&amp;Menu=No" target="blank">
<img id="qq2" src="http://wpa.qq.com/pa?p=1:1351962303:4" border="0" alt="给我发消息" /></a>

<a href="http://wpa.qq.com/msgrd?V=1&amp;Uin=1061177270&amp;Exe=QQ&amp;Site=im.qq.com&amp;Menu=No" target="blank">
<img id="qq3" src="http://wpa.qq.com/pa?p=1:1061177270:4" border="0" alt="给我发消息" /></a>


[转载]用一台电脑多久能破解你的密码

mikel阅读(1127)

[转载]用一台电脑多久能破解你的密码 – 小众软件.

想知道一台电脑多久就能破解你的密码,一年、十年还是几秒钟?

用一台电脑多久能破解你的密码[图] | 小众软件

感谢 juliet 同学的推荐,他还说道:

为你的网络账户设置一个足够长、足够复杂的密码已经是大家的常识了。但你的密码究竟有多安全?这个问题似乎很难有一个直观的计量方式。近日上线的一家新网站就在这方面做出了有趣的尝试。

其站名、网址相当直观:How Secure is my password网站界面中仅有一个文本框,只要输入你的密码即可马上给出其安全程度。

目前拿自己的qq密码尝试了一下,结果是

It would take About a billion years for a desktop PC to crack your password

这个网站 HOW SECURE IS MY PASSWORD? 能帮你计算出密码强度,使用一台电脑多久可以计算出来。快去试试吧,如果在几天内的话,可以改密码了。

对于担心密码安全的同学,可以使用相似的密码来测试,不要泄露了真实密码。

[转载]向其他程序注入托管程序集

mikel阅读(1036)

[转载]向其他程序注入托管程序集,很强。 – 唯笑志在 – 博客园.

上帝都知道托管程序集,那就必然就是托付管理…没有自主权了.
托管程序调用非托管程序集不外乎通过PInvoke或者COM接口调用.但是托管程 序集调用非托管程序集貌似也只能够通过COM了,至少在现行NET文档是这样子介绍的.虽然NET类库十分强大,大可不必操作平台API即可完成一个出色 的程序或者说程序集,不过有的时候我们还是需要的,特别是我们要操作其他程序行为的时候.
包括实现APi Hook.
穿透防火墙.
甚 至是实现无进程.当然这些在WIN32编程中是非常容易实现的.dotNet要带上一个数十MB的NET包裹,确实难…而且其实际意义…恐怕等到09年 Vista大范围普及的时候用处方能够显著.毕竟Net开发尤其是搞点窗体数据库这些是非常非常容易的.我本人也是非常喜欢dotNet的.
读者 仔细看我的标题会发现我说的是C#代码,而非dotNet代码.为什么呢?因为C#有一个特殊的地方在于它是纯粹的面向对象的语言.根本不提供全局方法. 其次在于.C#我个人或者数大多数人比较喜欢,有一定的代表性,最次的是,我确实无法忍受C++/Clr的开发方式…真的想吐的感觉.当然Vb.net也 不是本文讨论的重点.毕竟我个人还是不太喜欢Nothing这种语法.其实null看起来更专业.
好了废话就不说了.
在WIN32中比较独立的就算是进程了,当然这里没有说COM这些乱七八糟的东西.所以说我们所说的注入莫非也就是注入到别的进程中.
思考一下有些什么方法可以让别的进程加载我们的程序集:
1.  COM,很好的办法.微软在NET对COM的支持还是比较好的
2.  利用C++的Exports DLL功能,这个听起来还不错.
我这里就用第二种方法.第一种为什么不用呢?考虑到WIN32调用COM我不是很熟悉,其次感觉注册过来注册过去的不够环保,也不利于调试.
当然第二种方法偶其实也不算很喜欢…毕竟必须要用C++/Clr的代码.但毕竟还是有一点C++基础也不算太复杂.
实 现的基本思路就是利用C++/Clr或者其他语言甚至是WIN32建立一个注入机程序,然后利用注入机把另一个写好的C++/Clr 的DLL注入到目标 进程并初始化调用,其中这个DLL负责调用CShape的DLL.其实关键就在于中间的那个C++/Clr的DLL.其实整个过程理解起来非常容易.
我 用的远程线程插入的方法注入DLL(这种代码讨论太多了我就略过了),,顺便说说为什么我必须要用一个中转DLL.原因是这样的:在 Visual C++ 2005中MSDN 里面有一段话,大概意思是如果托管代码中用混合编程即含有本机代码,那么EntryPoint必须为本机函 数.这样子无法在初始化的时候调用托管代码,而我的窗体界面已经弄好,,,为了俭省就不去重新写本机的了,本身就算MFC画个窗体也是容易把脑壳搞大…希 望对后人有点帮助这句.
我们的C++/Clr就填充一个输出表
LIBRARY   ClrDllInjectHelper
EXPORTS
LoadCShapeDll
大概就像这个样子,
然后在注入的本机代码中调用
void WINAPI RemoteMain(void * Data)
{
__try
{
LPVOID pProc;
pProc = ::GetProcAddress(LoadLibraryW(DllPath),”LoadCShapeDll”);
if(pProc == NULL)
{
::MessageBoxA(NULL,”无法载入动态连接库,请检查文件完整性;\r\n 注入进程退出”,”错误”,MB_ICONERROR);
::ExitProcess(NULL);
}
__asm
{
lea eax,CShapeDllPath
push eax
call [pProc]
}
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
::MessageBoxA(NULL,”SEH异常Handlered!!!”,NULL,MB_ICONERROR);
}
//装载自己以加载托管代码
}大概代码就像这样子,我们以正常方式载入一个DLL.这样子这个DLL就可以调用托管程序集
在公开的DLL输出函数中调用
void __stdcall LoadCShapeDll(WCHAR * CShapeDllPath)
{
String ^ str;
try
{

Assembly ^ assembly;
str = ::System::Runtime::InteropServices::Marshal::PtrToStringAuto(System::IntPtr::IntPtr(CShapeDllPath));
assembly = ::Assembly::LoadFile(str);
Type ^ type = assembly->GetType(“CShapeDll.AppMain”);
System::Reflection::MethodInfo ^ mi = type->GetMethod(“Main”);
mi->Invoke(nullptr,nullptr);
}
catch (Exception ^ e)
{
System::Windows::Forms::MessageBox::Show(e->Message + “\r\n DllPath:” + str,”Error Occured When in injection Code”);
::ExitProcess(NULL);
}
// System::Windows::Forms::MessageBox::Show(“Debug”);
}
这样子就可以装载C#程序集
C#程序集我们只需要新建一个类库并且初始化一个静态类
代码向这样.
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
namespace CShapeDll
{
public static class AppMain
{
public static void Main()
{
MessageBox.Show(“Loaded”);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new FormMain());
}
}
public class Class1
{
}
}

即可.理论上非常简单的.这样子我们的任务就完成了.
现在我们来讨论一下为什么可以用C++/Clr输出一个DLL.
我们用OllyDbg加载有全局输出表的DLL.
我们会’惊讶’的发现有标准的输出表

这就意味着我们是完全可以通过这种方式装载托管/非托管代码的.当然我想这是C++之所以强大的原因之一吧.
我们在DLL没有初始化完成之前双击这个函数
会发现
100010D0 C> $- FF25 24800010        jmp dword ptr ds:[10008024]
100010D6       CC                   int3
100010D7       CC                   int3
它会跳到数据段中.而此时代码段中的数据是一个无效指针.当我们初始化DLL完成以后.
这个数据就会被填充.进而转到了Jitter中
79013370     58                     pop eax
79013371     55                     push ebp
79013372     8BEC                   mov ebp,esp
79013374     51                     push ecx
79013375     52                     push edx
79013376     50                     push eax
79013377     E8 87920000            call mscoree.7901C603
7901337C     5A                     pop edx
7901337D     59                     pop ecx
7901337E     5D                     pop ebp
7901337F     50                     push eax
79013380     C3                     retn
.因此.一旦我们用标准的LoadLibraryA/W方式载入了这个动态链接库.用GetProcAddress就可以平常WIN32的形式调用托管代码.这无疑是非常方便的.尤其是非托管要调用托管代码的话.
文章没有任何技术含量.各位看官全当儿戏即可.

源自:【百木破解】向其他程序注入托管程序集,很强。
http://www.bmpj.net/forum-viewthread-tid-254-fromuid-1.html

[转载]调用动态类型的扩展方法

mikel阅读(991)

[转载]调用动态类型的扩展方法 – 麒麟.NET – 博客园.

对于一个动态类型来说,你可以认为它包含任意成员,它们都能通过编译。但到了运行时,到底是否拥有这些成员,就真相大白了。如

dynamic test = 7;
Console.Write(test.Name);

编译器无法在编译时知道test的真正类型,因此会使用其运行时的实际类型,而默认对于它的所有调用都是合法的,不会引发任何编译时错误。但它会抛出一个运行时异常。因为在运行时,test为一个int,它不具备Name属性。

在编译时,编译器会根据会生成一些调用所需的上下文环境,如所有已知的静态类型等。但它无法知道在源代码中究竟引入了哪些命名空间。因此,你无法调用动态类型所代表的实际类型的扩展方法,也无法将动态类型作为参数传入扩展方法。如

dynamic size = 5;
var numbers = Enumerable.Range(1, 10);
var error = numbers.Take(size);

但我们有两种方法可以实现这两点,它们看上去可能有点丑陋,但在你需要的时候却会很有用。这两种方法为:

1. 将动态类型强制转换为已知的符合方法签名的静态类型

2. 以静态方法的形式调用

对于将动态类型作为参数传入扩展方法的情况,你可以这样

dynamic size = 5;
var numbers = Enumerable.Range(1, 10);
var workaround1 = numbers.Take((int)size);
var workaround2 = Enumerable.Take(numbers, size);

对于调用动态类型的扩展方法,可以这样

int size = 5;
dynamic numbers = Enumerable.Range(1, 10);
var workaround1 = ((IEnumerable<int>)numbers).Take(size);
var workaround2 = Enumerable.Take(numbers, size);

怎么样,很简单吧?

这其实是我在阅读Jon Skeet的新书C# in Depth, Second Edition时遇到的问题,当时脑子犯懵有点不能理解,于是想起Jon时常活跃于Stackoverflow,何不发帖问问这个问题?没想到仅仅十几分钟的时间,Jon就给予了解答,甚至有人怀疑我是蓄意为之……而且,更令人开心的是,还得到了博客园的朋友Colin Han的回答。

所以,如果你有什么难题一时无法应对,不妨去求助于Stackoverflow,去咨询一下全世界范围内的高手牛人们,相信你一定会得到满意的答复。

[转载]字符串转换成JSON的三种方式

mikel阅读(1147)

[转载]字符串转换成JSON的三种方式 – Snandy – 博客园.

采用Ajax的项目开发过程中,经常需要将JSON格式的字符串返回到前端,前端解析成JS对象(JSON )。
ECMA-262(E3) 中没有将JSON概念写到标准中,但在 ECMA-262(E5) 中JSON的概念被正式引入了,包括全局的JSON对象和Date的toJSON方法。

1,eval方式解析,恐怕这是最早的解析方式了。

1 function strToJson(str){
2 var json = eval('(' + str + ')');
3 return json;
4 }

记得str两旁的小括号哦。
2,new Function形式,比较怪异哦。

1 function strToJson(str){
2 var json = (new Function("return " + str))();
3 return json;
4 }


3,使用全局的JSON对象。

1 function strToJson(str){
2 return JSON.parse(str);
3 }

目前IE8(S)/Firefox3.5+/Chrome4/Safari4/Opera10 已实现了该方法。

使用JSON.parse需严格遵守JSON规范,如属性都需用引号引起来,如下

1 var str = '{name:"jack"}';
2 var obj = JSON.parse(str); // --> parse error

name没有用引号引起来,使用JSON.parse所有浏览器中均抛异常,解析失败。而前两种方式则没问题。
相关:

http://blogs.msdn.com/ie/archive/2008/09/10/native-json-in-ie8.aspx
https://developer.mozilla.org/en/Using_JSON_in_Firefox

[转载]C#程序抓取网页源码实例(winform程序)

mikel阅读(948)

[转载]C#程序抓取网页源码实例(winform程序)-纯野.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.IO;
using System.Text.RegularExpressions;
using System.Collections;

namespace CopyHtml
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
//获取指定网页中的源数据

string rl;
WebRequest Request = WebRequest.Create(textBox1.Text.Trim());

WebResponse Response = Request.GetResponse();

Stream resStream = Response.GetResponseStream();

StreamReader sr = new StreamReader(resStream, Encoding.Default);
StringBuilder sb = new StringBuilder();
while ((rl = sr.ReadLine()) != null)
{
sb.Append(rl);
}
textBox2.Text = sb.ToString();//抓取得到的源网页

string he = textBox2.Text.ToString();

textBox3.Text = stripHtml(he);//去除html标签后得到的源网页

Match TitleMatch = Regex.Match(he, “([^<]*)“, RegexOptions.IgnoreCase | RegexOptions.Multiline);//获取网页的标题
string title = TitleMatch.Groups[1].Value;

textBox4.Text = (“网页的标题是:” + title );

}

///

/// 去掉网页中的html标签
///

/// 待转化的字符串 ///
private string stripHtml(string strHtml)
{
Regex objRegExp = new Regex(“<(.|\n)+?>“);
string strOutput = objRegExp.Replace(strHtml, “”);
strOutput = strOutput.Replace(“<", "<"); strOutput = strOutput.Replace(">“, “>”);
return strOutput;
}

// 提取HTML代码中的网址
public static ArrayList GetHyperLinks(string htmlCode)
{
ArrayList al = new ArrayList();

string strRegex = @”(href)[ ]*=[ ]*[“”‘][^””‘#>]+[“”‘]”;

Regex r = new Regex(strRegex, RegexOptions.IgnoreCase);
MatchCollection m = r.Matches(htmlCode);

for (int i = 0; i <= m.Count - 1; i++) { bool rep = false; string strNew = m[i].ToString(); // 过滤重复的URL foreach (string str in al) { if (strNew == str) { rep = true; break; } } if (!rep) al.Add(strNew); } al.Sort(); return al; } } } [/csharp]

[转载]FlashFXP打造自动镜像更新

mikel阅读(1017)

[转载]FlashFXP打造自动镜像更新 – 电仔的博客 – 博客园.

朋友公司最近又买了一台服务器,但是接入的是电信宽带(原先的服务器是网通宽带),朋友想用电信宽带作为镜像,从原服务器上同步(下载)一些视频文件,而且要能够实现每隔一段时间自动扫描更新的文件,然后进行同步,即使服务器重启了也能够自启动

环境:

网通服务器  Windows 2008 Server、Server-U服务器

电信服务器  Windows 2008 Server R2 64X 、FlashFXP_4.0.0.1510

一开始搜索了晚上的文章,有用网络传神、Web Synchronizer等等各种同步软件。

于是尝试,发现网络神传不能够后台运行,也不能够以服务形式运行,而且只能够定时上传故舍弃~

然后是用Web Synchronizer,发现电信服务器的能够连接到网通服务器的21端口上,但是状态一直停留在Scanning,无法完成同步~~放弃……

之后上网搜索了很多种FTP软件,同步工具,发现都不符合要求, 最后把希望寄托在了FlashFXP上。

笔者使用的是FlashFXP_4.0.0.1510_Crack 绿色又是注册版 挺好用的~

经过尝试发现做如下设置即可实现上述功能:

1、建立一个站点, 我建立的是网通服务器的FTP连接

注意:FTP服务器用户 test对应的目录应该要锁定在预同步目录的上一级目录上

设置完成之后点击应用 ,然后点击连接

2、建立队列

连接到刚刚建立的FTP服务器后,找到要同步的目录,右击该目录,选择队列

然后会在队列区看到 刚才建立的队列

右击队列区的那个队列,另存为 test.fqf

3、编辑文件传输规则

编辑文件传输规则是为了确保每次只更新最新的文件

打开 菜单栏 选项>文件传输规则>添加

添加如下两条规则:

4、建立计划任务

Task Scheduler 必须开启~ 否则会出错哦~

点击菜单栏的工具>计划>新建任务

任务名称 test 队列文件选择刚刚新建的那个队列文件 test.fqf

在计划这个标签里面进行如下设置

然后到Windows标签进行如下设置,确保能够自启动

首先勾空 “只有在用户登录后才运行任务”

然后输入管理员或者能够进行相应操做的用户的用户名和密码

日志等等依据个人习惯自行设置吧~

总结:

这样设置,就能够满足一开始提出的问题。并且能够依托于服务进行更新。

但是有几点需要注意:

如果需要同步的文件夹的文件很多或者文件较大时,则应该把检测的间隔时间调大一点,否则会比较占用资源。

Task Scheduler 必须开启~ 否则会出错哦~