高手请教!怎样自动将文件夹中新的文件上传到FTP

sisihu 2009-08-11 11:32:00
RT~
谢谢哦
...全文
125 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
sisihu 2009-08-11
  • 打赏
  • 举报
回复
谢谢楼上哦~
MoXiaoRab 2009-08-11
  • 打赏
  • 举报
回复
可以监视...
介绍三种非驱动实现文件监视的方法。


=================================================================

通过 未公开API SHChangeNotifyRegister 实现

=================================================================
Windows 内部有两个未公开的函数(注:在最新的MSDN中,已经公开了这两个函数),分别叫做SHChangeNotifyRegister和 SHChangeNotifyDeregister,可以实现以上的功能。这两个函数位于Shell32.dll中,是用序号方式导出的。这就是为什么我们用VC自带的Depends工具察看Shell32.dll时,找不到这两个函数的原因。SHChangeNotifyRegister的导出序号是 2;而SHChangeNotifyDeregister的导出序号是4。
SHChangeNotifyRegister可以把指定的窗口添加到系统的消息监视链中,这样窗口就能接收到来自文件系统或者Shell的通知了。而对应的另一个函数,SHChangeNotifyDeregister,则用来取消监视钩挂。SHChangeNotifyRegister的原型和相关参数如下:
ULONG SHChangeNotifyRegister
(
HWND hwnd,
int fSources,
LONG fEvents,
UINT wMsg,
Int cEntries,
SHChangeNotifyEntry *pfsne
);
其中:
hwnd
将要接收改变或通知消息的窗口的句柄。
fSource
指示接收消息的事件类型,将是下列值的一个或多个(注:这些标志没有被包括在任何头文件中,使用者须在自己的程序中加以定义或者直接使用其对应的数值)
SHCNRF_InterruptLevel
0x0001。接收来自文件系统的中断级别通知消息。
SHCNRF_ShellLevel
0x0002。接收来自Shell的Shell级别通知消息。
SHCNRF_RecursiveInterrupt
0x1000。接收目录下所有子目录的中断事件。此标志必须和SHCNRF_InterruptLevel 标志合在一起使用。当使用该标志时,必须同时设置对应的SHChangeNotifyEntry结构体中的fRecursive成员为TRUE(此结构体由函数的最后一个参数pfsne指向),这样通知消息在目录树上是递归的。
SHCNRF_NewDelivery
0x8000。接收到的消息使用共享内存。必须先调用SHChangeNotification_Lock,然后才能存取实际的数据,完成后调用SHChangeNotification_Unlock函数释放内存。
fEvents
要捕捉的事件,其所有可能的值请参见MSDN中关于SHChangeNotify函数的注解。
wMsg
产生对应的事件后,发往窗口的消息。
cEntries
pfsne指向的数组的成员的个数。
pfsne
SHChangeNotifyEntry 结构体数组的起始指针。此结构体承载通知消息,其成员个数必须设置成1,否则SHChangeNotifyRegister或者 SHChangeNotifyDeregister将不能正常工作(但是据我试验,如果cEntries设为大于1的值,依然可以注册成功,不知何故)。
如果函数调用成功,则返回一个整型注册标志号,否则将返回0。同时系统就会将hwnd指定的窗口加入到操作监视链中,当有文件操作发生时,系统会向hwnd标识的窗口发送wMsg指定的消息,我们只要在程序中加入对该消息的处理函数就可以实现对系统操作的监视了。
如果要退出程序监视,就要调用另外一个未公开得函数SHChangeNotifyDeregister来取消程序监视。该函数的原型如下:
BOOL SHChangeNotifyDeregister(ULONG ulID);
其中ulID指定了要注销的监视注册标志号,如果卸载成功,返回TRUE,否则返回FALSE。
=================================================================

通过 FindFirstChangeNotification 实现

=================================================================


FindFirstChangeNotification函数创建一个更改通知句柄并设置初始更改通知过滤条件.
当一个在指定目录或子目录下发生的更改符合过滤条件时,等待通知句柄则成功。
该函数原型为:
HANDLE FindFirstChangeNotification(
LPCTSTR lpPathName, //目录名
BOOL bWatchSubtree, // 监视选项
DWORD dwNotifyFilter // 过滤条件
);

当下列情况之一发生时,WaitForMultipleObjects函数返回
1.一个或者全部指定的对象在信号状态(signaled state)
2.到达超时间隔


例程如下:
DWORD dwWaitStatus;
HANDLE dwChangeHandles[2];

//监视C:\Windows目录下的文件创建和删除

dwChangeHandles[0] = FindFirstChangeNotification(
"C:\\WINDOWS", // directory to watch
FALSE, // do not watch the subtree
FILE_NOTIFY_CHANGE_FILE_NAME); // watch file name changes

if (dwChangeHandles[0] == INVALID_HANDLE_VALUE)
ExitProcess(GetLastError());

//监视C:\下子目录树的文件创建和删除

dwChangeHandles[1] = FindFirstChangeNotification(
"C:\\", // directory to watch
TRUE, // watch the subtree
FILE_NOTIFY_CHANGE_DIR_NAME); // watch dir. name changes

if (dwChangeHandles[1] == INVALID_HANDLE_VALUE)
ExitProcess(GetLastError());

// Change notification is set. Now wait on both notification
// handles and refresh accordingly.

while (TRUE)
{

// Wait for notification.

dwWaitStatus = WaitForMultipleObjects(2, dwChangeHandles,FALSE, INFINITE);

switch (dwWaitStatus)
{
case WAIT_OBJECT_0:

//在C:\WINDOWS目录中创建或删除文件 。
//刷新该目录及重启更改通知(change notification).

AfxMessageBox("RefreshDirectory");
if ( FindNextChangeNotification(dwChangeHandles[0]) == FALSE )
ExitProcess(GetLastError());
break;

case WAIT_OBJECT_0 1:
//在C:\WINDOWS目录中创建或删除文件 。
//刷新该目录树及重启更改通知(change notification).

AfxMessageBox("RefreshTree");
if (FindNextChangeNotification(dwChangeHandles[1]) == FALSE)
ExitProcess(GetLastError());
break;

default:
ExitProcess(GetLastError());
}
}


=================================================================

通过 ReadDirectoryChangesW 实现

=================================================================

bool Monitor()
{


HANDLE hFile = CreateFile(
"c:\\",
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
NULL,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS,
NULL
);
if( INVALID_HANDLE_VALUE == hFile ) return false;

char buf[ 2*(sizeof(FILE_NOTIFY_INFORMATION)+MAX_PATH) ];
FILE_NOTIFY_INFORMATION* pNotify=(FILE_NOTIFY_INFORMATION *)buf;
DWORD BytesReturned;
while(true)
{
if( ReadDirectoryChangesW( hFile,
pNotify,
sizeof(buf),
true,
FILE_NOTIFY_CHANGE_FILE_NAME|
FILE_NOTIFY_CHANGE_DIR_NAME|
FILE_NOTIFY_CHANGE_ATTRIBUTES|
FILE_NOTIFY_CHANGE_SIZE|
FILE_NOTIFY_CHANGE_LAST_WRITE|
FILE_NOTIFY_CHANGE_LAST_ACCESS|
FILE_NOTIFY_CHANGE_CREATION|
FILE_NOTIFY_CHANGE_SECURITY,
&BytesReturned,
NULL,
NULL ) )
{
char tmp[MAX_PATH], str1[MAX_PATH], str2[MAX_PATH];
memset( tmp, 0, sizeof(tmp) );
WideCharToMultiByte( CP_ACP,0,pNotify->FileName,pNotify->FileNameLength/2,tmp,99,NULL,NULL );
strcpy( str1, tmp );

if( 0 != pNotify->NextEntryOffset )
{
PFILE_NOTIFY_INFORMATION p = (PFILE_NOTIFY_INFORMATION)((char*)pNotify+pNotify->NextEntryOffset);
memset( tmp, 0, sizeof(tmp) );
WideCharToMultiByte( CP_ACP,0,p->FileName,p->FileNameLength/2,tmp,99,NULL,NULL );
strcpy( str2, tmp );
}

// your process
}
else
{
break;
}
}

return true;
}
sisihu 2009-08-11
  • 打赏
  • 举报
回复
那可不可以通过监控文件夹来实现自动上传呢?当有新的文件时就上传
但是监控文件夹有新文件怎么弄呢
「已注销」 2009-08-11
  • 打赏
  • 举报
回复
找找MFC中的FTP支持类,看着就会上传了

使用Shell监视文件夹变化进行上传,基本上就完全同步了
zaodt 2009-08-11
  • 打赏
  • 举报
回复
分两步:

1、先实现手动上传;

2、加个定时器,实现自动上传。
sisihu 2009-08-11
  • 打赏
  • 举报
回复
to:yuhudie203
网上一般都是FTP客户端的资源,自动上传的好像很少哦
岁月小龙 2009-08-11
  • 打赏
  • 举报
回复
好的
yuhudie203 2009-08-11
  • 打赏
  • 举报
回复
建议你去网上找找FTP上传服务器的相关资料
CuteFTP Pro 9.0.5 中文注册版是一个全新的商业级 FTP 客户端程序,其加强的文件传输系统能够完全满足今天的商家们的应用需求。 这里文件通过构建于SSL或SSH2安全认证的客户机/服务器系统进行传输,为VPN、WAN、Extranet开发管理人员提供最经济的解决方案!企业再不需要为了一套安全的数据传输系统而进行破费了。 此外,CuteFTP Pro 9.0.5还提供了Sophisticated Scripting、目录同步、自动排程、同时多站点连接、多协议支持(FTP、SFTP、HTTP、HTTPS)、智能覆盖、整合的HTML编辑器等功能特点以及更加快速的文件传输系统。 经典实用的 FTP 工具 CuteFTP Pro 中文版经典实用的 FTP 工具 CuteFTP Pro 中文版 CuteFTP Pro 9.0.5 官方中文特别版是最好的FTP客户程序之一,友好的用户界面,稳定的传输速度,LeapFTP 与 FlashFXP 、CuteFTP 堪称 FTP 三剑客。FlashFXP 传输速度比较快,但有时对于一些教育网 FTP 站点却无法连接;LeapFTP 传输速度稳定,能够连接绝大多数 FTP 站点(包括一些教育网站点);CuteFTP 虽然相对来说比较庞大,但其自带了许多免费的 FTP 站点,资源丰富。 如果你是CuteFTP老版本的用户,你会发现很多有用的新特色,如目录比较,目录上传和下载,远端文件编辑,以及IE风格的工具条,可让你编列顺序一次下载或上传同一站台中不同目录下的文件。 CuteFTP Pro 9.0.5 与杰出的安全标准相集成,有效保护了企业数据。该产品具有极高的性价比,在上传或浏览的同时还能够从多个站点下载数据或文件,使网络带宽吞吐量达到最大,另外,它还能自动更新Web内容,自动定制数据管理过程。 CuteFTP Pro 9.0.5 简洁明了的界面上主要有三个窗格:左上的本地驱动器和站点管理器窗格、右上的服务器目录窗格、下面的队列和日志窗格。本地驱动器和站点管理器窗格可切换使用,本地驱动器用于浏览本地目录及文件,主要用于上传用,站点管理器显示你所加入的远程站点,主要用于下载用。服务器目录用于显示FTP服务器上的目录信息。队列窗格可以看到你上传或下载的文件或目录,一行一个条目,同时标明了文件的名称、大小,速度等详细的信息,日志窗格显示当前服务器窗口的日志信息,与队列切换使用。 新建站点简单快捷,输入站点名称、建立FTP站点的IP地址、FTP站点提供的用户名和密码,点击连接即可完成FTP站点的建立。CuteFTP支持站点导出和导入,即只要建过的站点,可以拿来直接使用,不需要再做设置。 CuteFTP Pro 9.0.5支持文件上传、下载及文件续传。支持恢复队列,即使软件关闭后,再次打开时传输队列还能恢复,使您轻松继续传输文件。 传输的整个过程只需选中本地要上传的文件或服务器端要下载的文件,然后一拖动就OK了,接下来的工作就交给 CuteFTP 来完成了。下载与上传文件支持续传,可上传或下载整个目录。 Cute FTP Professional相比于其他FTP客户端的优势: 连接:通过您的本机或HTTP代理、防火墙或SOCKS服务器同时连接到多个站点。 安全:使用工业标准的SSH2、SSL或OTP(S/Key)协议保护您的登录和传输行为。 传输:执行并发传输,加快了大文件的传输,允许主机间传输、压缩传输和批传输预定等。 管理:编辑或浏览远程内容,同步或备份您的站点,监控文件夹变动,执行其他站点管理操作。 自动化:使用自行开发的脚本同Cute FTP基于COM的传输引擎相交互,也可以通过Cute FTP的脚本记录&回放功能创建该种脚本。 新版本的CuteFTP改进了总体性能,增加了新特性。它是世界上使用最多的FTP客户端之一,当然也包括我,我也非常喜欢它,传输速度可以说在FTP客户端中是最快的。 CuteFTP Pro 9.0.5 中的新功能: 合并精简版,家庭版和专业版合并为一体的CuteFTP Pro功能强大的FTP客户端。 新的CuteFTP V9.0的有你所期待的Pro Plus中新的关键增强所有功能和安全性。 你可以在您的计算机上安全地访问和共享文件到任何其他设备如:iPad,iPhone,Android、笔记本电脑,台式机,苹果电脑等。 支持UNICODE字符集 CuteFTP V9在整个产品中支持UTF-8字符集。 迁移网站和选项设置 旧版本的网站和全局选项设置,安装过程中将自动迁移升级。 CuteFTP V9包括WebDAV协议的支持。 改进的上下文相关的帮助 经典实用的 FTP 工具 CuteFTP Pro 中文版经典实用的 FTP 工具 CuteFTP

16,547

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧