`
guowee
  • 浏览: 176741 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

windows mobile 监控 文件夹

阅读更多

今天的任务是要保存一个文件。平常看别人怎么写,自己还只是看,没有动手去写过,对各个API相应的参数不是很了解。今天在运用的时候,还真是遇见了一些问题。

我们先来说说问题:
第一个问题:使用WriteFile的时候,我直接将宽字符串写进了文件,文件显示如大家所想,掺杂了很多乱码。但是很有规则。所以我很快就明白了这需要将宽字符串转换成ASCII码。
第二个问题:就是我将文件打开后,又进行了写文件的操作,此时失败。所以对这种情况,还没有想出办法,是由于CreateFile的参数的某些限制么?

由于这两个问题,所以我也好好看了一下SDK文档。
我们先来看一下CreateFile和WriteFile的原型和参数介绍:

HANDLE CreateFile(
  LPCTSTR lpFileName ,  // 文件名
  DWORD dwDesiredAccess ,  // 访问方式
  DWORD dwShareMode ,  // 共享模式
  LPSECURITY_ATTRIBUTES lpSecurityAttributes ,  // 设为NULL
  DWORD dwCreationDisposition ,  /// 创建方式
  DWORD dwFlagsAndAttributes ,  // 属性
  HANDLE hTemplateFile
);

BOOL WriteFile(

 HANDLE hFile , // 文件句柄

 LPCVOID lpBuffer , // 包含写向文件的数据

 DWORD nNumberOfBytesToWrite , // 数据包含的字符串的个数

 LPDWORD lpNumberOfBytesWritten ,

 LPOVERLAPPED lpOverlapped

);

第一次我写的程序很简单

BOOL WriteOwnFile(TCHAR* pFileName, TCHAR* pBuffer, DWORD dwLen)

{

        HANDLE hFile = CreateFile(pFileName,

                       GENERIC_WRITE,

                                              FILE_SHARE_WRITE,

                                              NULL,

                                              CREATE_ALWAYS,

                                              FILE_ATTRIBUTE_NORMAL,

                                              NULL

                                              );

 

                 if (INVALID_HANDLE_VALUE != hFile)

               {

                                              DWORD dwSize = 0;

                                              WriteFile(hFile, pBuffer, dwLen, &dwSize, NULL );

                                              CloseHandle(hFile);

                                              return TRUE;

               }

               return FALSE;

}

 

这样是完成了,但是写出来的文件是乱码。所以没有进行字符的转换,我们需要将pBuffer进行转换。这就要用到了WideCharToMultiByte.如何用呢?

首先我的方法比较笨,我是这么用的:

char* pchBuffer = new char[dwLen+1];

WideCharToMultiByte(CP_ACP, NULL, pBuffer, -1, pchBuffer, dwLen+1, NULL, FALSE );

WriteFile(hFile, pBuffer, dwLen+1, &dwSize, NULL );

 Delete[] pchBuffer;

 

此时注意,我在WriteFile中用了dwLen+1。结果就是在文件的末尾出现了乱码,正好多一个乱码出来。所以WriteFile中nNumberOfBytesToWrite是写的字符串的数目,是不包括’\0’的。

 

这个方法笨,是因为我们的函数可以缩减为两个参数。是因为如下这么写时,dwLen是所要转换的字符串的个数,此时转换的字符串是包括’\0’的。

DWORD dwLen = WideCharToMultiByte(CP_ACP, NULL, pBuffer, -1, NULL, NULL, NULL, FALSE );

 

所以我们再来看一下改写以后的代码

BOOL WriteOwnFile(TCHAR* pFileName, TCHAR* pBuffer)

{

        HANDLE hFile = CreateFile(pFileName,

                       GENERIC_WRITE,

                                              FILE_SHARE_WRITE,

                                              NULL,

                                              CREATE_ALWAYS,

                                              FILE_ATTRIBUTE_NORMAL,

                                              NULL

                                              );

 

                               if (INVALID_HANDLE_VALUE != hFile)

               {

                                              DWORD dwSize = 0;

                                              DWORD dwLen = WideCharToMultiByte(CP_ACP, NULL, pBuffer, -1, NULL, NULL, NULL, FALSE );

                                              char* pchBuffer = new char[dwLen];

                                              WideCharToMultiByte(CP_ACP, NULL, pBuffer, -1, pchBuffer, dwLen, NULL, FALSE );

                                              WriteFile(hFile, pBuffer, dwLen+1, &dwSize, NULL );

                                               delete[] pchBuffer;

                                              CloseHandle(hFile);

                                              return TRUE;

               }

               return FALSE;

}

 

 

这样感觉代码好看多了。

 

对于第二个问题,文件打开的时候文件创建失败,还没有想好办法解决。我在想是不是我的某些认知存在问题,文件打开的时候,是否可以用CreateFile来打开呢?

 

补充:

程序的读和写都是自己控制的,所以我在写文件的时候,没有必要进行字符串。读文件的时候也按照相应的字符读取即可。所以我的代码使用最初的代码就可以了。

posted @ 2009-02-20 23:59 sandyqy 阅读(291) | 评论 (0)编辑
 

今天完成了一个任务,就是在mobile上如何监控文件的操作。这个SDK中有相应的例子,为FileChangeNotif。

  如何实现文件监控?
         首先要在窗口注册,这个要用到SHChangeNotifyRegister ,这个函数的主要功能就是列举一个窗口来接收change notifications.
         在这个注册的窗口中,响应WM_FILECHANGEINFO 这个消息,来进行我们响应的操作。
         如何我们不想监控了,则可以使用SHChangeNotifyDeregister ,来移除相应的注册窗口。

这样我们就可以实现对一个文件夹内文件的生成,删除,改名等等操作的监控。

下面我们再具体来谈谈每一步如何操作。
1 、SHChangeNotifyRegister 的运用
   SHChangeNotifyRegiste r的原型为
  BOOL WINAPI SHChangeNotifyRegister(

HWND hwnd,

SHCHANGENOTIFYENTRY * pshcne

);

   其中,hwnd,为接收change notification的窗口;

pshcne 是一个指向SHCHANGENOTIFYENTRY结构的指针,它用来指明窗口接收的change notification的类型.如果设为NULL,窗口将接收all file system, network 和 media类型的notifications.

SHCHANGENOTIFYENTRY 是什么样的一个结构,我们看一下它的定义

typedef  struct  tagSHCHANGENOTIFYENTRY {
   DWORD dwEventMask;
   LPTSTR pszWatchDir;
 BOOL fRecursive;

} SHCHANGENOTIFYENTRY;

dwEventMask 指定发生什么时间来发送notification 消息

pszWatchDir 指定监控路径,该值为NULL的情况下,是监控所有的文件。

fRecursive 指定是否只监控指定路径还是监控指定路径及其子文件夹。

 

知道了这些,我们不妨写一个这样的函数,来启动文件监控。

代码如下:

BOOL StartFileMonitor(HWND hWnd, LPTSTR lpFilePath)

{

     SHCHANGENOTIFYENTRY schneNotifyEntry;

     schneNotifyEntry.dwEventMask = SHCNE_ALLEVENTS;

     schneNotifyEntry.pszWatchDir = lpFilePath;

     schneNotifyEntry.fRecursive = TRUE;

 

     return SHChangeNotifyRegister(hWnd, &schneNotifyEntry);

}

2 、如何处理WM_FILECHANGEINFO 消息

WM_FILECHANGEINFO 中的参数lParam,指向FILECHANGENOTIFY ,含有相关的数据。所以我们在收到该消息后,先作的一部操作就是

FILECHANGENOTIFY *lpfcn = (FILECHANGENOTIFY*)lParam;

FILECHANGENOTIFY 的结构为:

typedef struct tagFILECHANGENOTIFY {

 DWORD dwRefCount;

 FILECHANGEINFO fci;

} FILECHANGENOTIFY;

我们主要用到了其中的fci参数。

FILECHANGEINFO 的结构为:

struct _FILECHANGEINFO {

 DWORD cbSize;

 LONG wEventId;

 ULONG uFlags;

 DWORD dwItem1;

 DWORD dwItem2;

 DWORD dwAttributes;

 FILETIME ftModified;

 ULONG nFileSize;

} FILECHANGEINFO, *LPFILECHANGEINFO;

dwEventId 与SHCHANGENOTIFYENTRY结构中的dwEventMask 对应。

dwItem1,dwItem 2是事件依赖的值,里面包括了我们需要的文件的完整路径。如果是进行创建文件的操作,则dwItem1 是创建后文件的完整路径,如果是对文件进行重新命名操作的话,则dwItem2 是修改后文件的完整路径。此处对其他参数不做介绍,大家需要的话,可以查看一下。

 

我们做完相应的操作后,要知道释放,此时要用到SHChangeNotifyFree 。这个用起来就简单很多,如SHChangeNotifyFree (lpfcn)。

 

下面给大家一小段示例代码,如下

case WM_FILECHANGEINFO:

     {  

FILECHANGENOTIFY    *lpfcn;

          FILECHANGEINFO        *lpfci;   

lpfcn = (FILECHANGENOTIFY *)lParam;

         if (NULL == lpfcn)

         {

             break;

         }

         // see if the pointer to the file change info structure

         lpfci = &(lpfcn->fci);

         if (NULL == lpfci)

         {

             break;

         }

           else

           {

               switch (lpfci->wEventId) 

                     {

                     case SHCNE_RENAME:

                            {

                                   //……

                            }

                            break;

                     }    

           }

           SHChangeNotifyFree(lpfcn);

}

break;

 

3 、如何停止文件监控

   停止文件监控比较简单,只要使该窗口不接收WM_FILECHANGEINFO 消息即可。使用SHChangeNotifyDeregister(hWnd) 即可。

 

以上是我今天学习的一些总结,此外需要注意的一个小地方,在mobile上,把一个文件从一个文件夹拷到另一个文件夹,此时响应的事件是 SHCNE_CREATE,二从电脑上拷贝一个文件到mobile上,响应的消息为SHCNE_RENAME。我注意到从电脑上拷贝的话,mobile会 先生成一个Temp文件夹内生成一个临时文件,然后再在我们指定的文件夹内生成一个文件。这个机制我还不是很清楚为什么。

分享到:
评论
1 楼 guowee 2009-06-11  
注意: 监控的文件夹名称最后不能有 \

相关推荐

    windows mobile File System

    6. **文件系统架构**:Windows Mobile使用单一根文件系统,这意味着所有文件、文件夹和外部存储设备都通过单一的层次命名空间暴露出来,根目录是`\`。RAM文件系统或可选的外部文件系统可能被挂载在根目录下,而ROM...

    windows mobile 常用函数

    Windows Mobile 6 提供了一组丰富的API函数,旨在帮助开发者构建功能齐全且高效的应用程序。这些函数涵盖了多个领域,如文件系统监控、用户界面管理、输入处理和系统资源控制等。下面将详细介绍其中的一些关键函数。...

    今日屏幕快捷方式插件

    这个插件是基于Windows Mobile 6 SDK中的Samples项目,具体来说,是从"PocketPC"目录下的"CPP"子目录里的"win32"文件夹中的"memwatcher"示例代码修改而来的。"memwatcher"原项目主要是用来监控设备内存使用情况的,...

    WTD.zip_watchdog_wtd_wtd/..com_zip

    这个标题暗示我们这个文件可能与Windows Mobile平台上的一个监控或看门狗服务有关。"WTD"可能是"Watchdog Timer Device"或者特定项目或应用的缩写。 描述中的"watchDog windows mobile"进一步确认了这是一个针对...

    WM SKTools

    "WM SKTools"是一款专为Windows Mobile操作系统设计的资源管理器和系统工具集。这款软件在Windows Mobile平台上的重要性不言而喻,因为它提供了许多原生系统未包含的功能和优化,极大地提升了用户对设备的控制和管理...

    蓝牙监控通讯

    OpenNETCF是一个开源的.NET Compact Framework库,可以帮助开发者在Windows CE、Windows Mobile等平台上进行蓝牙应用开发。 7. `OpenNETCF.Net.Bluetooth_050115` 和 `OpenNETCF.Net`:这些可能是OpenNETCF库的不同...

    mapirule短信拦截

    标题“mapirule短信拦截”...总的来说,"mapirule短信拦截"项目展示了如何利用Windows Mobile平台的开发工具和技术来实现对短信的监控和管理,它涉及到移动设备编程、系统API交互以及用户隐私保护等多个方面的知识。

    Ch4.rar_CSharp battery_电池

    描述中提到,“这是一个用C#在windowsmobile平台上开发的电池电量的程序,功能相当强大”。这暗示了该程序不仅提供了基本的电池电量显示,可能还包含了一些高级特性,如电池健康检查、电量预测、充电状态通知等。在...

    dopod585软件合集

    多普达585是一款经典的智能手机,运行在Windows Mobile操作系统上,因此这个合集中的软件很可能都是为这个系统设计的。 【描述】提到的几个软件分别是: 1. **右键总管**:这可能是一款针对Windows Mobile的文件...

    手持机连接PC win7 64位

    Honeywell 6500可能使用Microsoft的ActiveSync或者更现代的Windows Mobile Device Center(WMDC)来实现与PC的数据同步。 2. 文件名“ActiveSync6_64”可能是指ActiveSync 6.6 64位版本,这是一款用于Windows Mobile...

    mcafee dlp

    - **移动终端**:支持Windows Mobile 6.0 for Smartphone、Windows Mobile 5.0 for Smartphone和Windows Mobile 5.0 for Pocket PC等操作系统。 - **硬件要求**:最低195MHz CPU,64MB RAM,支持TCP/IP网络连接。 - ...

    1-Symantec_symposium_终端内容安全防护.pptx

    5. **终端加密**:赛门铁克Endpoint Encryption提供了智能终端加密,支持Windows Mobile/Blackberry设备,以及文件和文件夹加密。全盘加密(Whole Disk Encryption)确保即使设备丢失,数据也无法被未经授权的人员...

    DTcms_50_sql_src 旗舰版(2018年4月亲测带手机)

    这个旗舰版特别之处在于它包含了"mobile"文件夹,这意味着它支持移动设备访问,提供了响应式设计,能够适应不同屏幕尺寸的手机和平板电脑。 源码的发布对于开发者来说具有极高的价值,因为它允许用户深入理解系统的...

    cmd命令提示符.txt

    虽然该命令在Windows Mobile设备上非常有用,但在现代Windows版本中已被替代。 ##### 2.15 dxdiag `dxdiag`命令打开DirectX诊断工具,用于检查DirectX组件的状态以及显示系统信息。这对于排查与DirectX相关的游戏和...

    01-RoboModule-RMDS系列驱动器-如何安装FT232的串口驱动1

    FTDI提供了一个名为“Chip Driver for Mobile (CDM)”的驱动包,例如CDM v2.10.00 WHQL Certified.zip。你可以通过官方渠道,如RoboModule网站(http://www.robomodule.net/download/New_Edition/)下载这个驱动...

    Android-RIL结构分析与移植.docx编程资料

    - Windows Mobile RIL则更紧密地集成于Windows CE环境中,支持特定的硬件和驱动模型。 #### 三、Android RIL移植 - **概念**: 将Android RIL适配到不同的硬件平台和网络设备上。 - **关键步骤**: - **硬件抽象层...

    -远程通安装使用说明手册

    5. **手机操作系统**:针对移动设备,远程通支持Windows Mobile平台6.0及以上版本,这意味着在早期的智能手机和平板电脑上,用户也能享受到远程访问服务。 6. **网络协议**:系统支持TCP/IP、SSL、HTTP/HTTPS协议,...

    手机浏览说明书

    这些方法适用于不同类型的手机设备,例如基于不同操作系统(如Windows Mobile、Java平台)的手机。 #### 二、静态图像浏览 1. **方法**: 访问`http://ip:port/jpg/channel` - 这种方法用于获取静态图像。 - 任何...

    移动定位系统和GVA目标管理系统.doc

    这两个系统都需要PDA具有一定的硬件配置,例如,处理器为Intel PXA263 400MHz,搭配Qualcomm MSM5500芯片,内存为ROM 64MB和RAM 64MB,操作系统为Windows Mobile Software。设备还配备TFT-LCD触摸屏,分辨率为240*...

Global site tag (gtag.js) - Google Analytics