【IDL】IDL8.4 文件监视系统体验
1.利用SuperView数据基于ENVI深度学习进行建筑物提取2.ENVI发布深度学习产品:ENVI Deep Learning Module3.澳大利亚市政局利用ENVI深度学习进行树木调查4.ENVI软件系列产品体系结构5.ENVI新机器学习:ENVITask 使用说明6.ENVI新机器学习:随机森林遥感分类工具操作手册7.ENVI新机器学习:异常探测分类工具操作手册8.新机器学习遥感分类工具9.ENVI深度学习2.0新特性10.IDL封装百度翻译API实现自动翻译和语种识别11.使用IDL进行氚羽流监测(五)—绘制污染物扩散带等值线图12.使用DL进行氚羽流监测(四)——绘制预期氚衰变图13.使用IDL进行氚羽流监测(三)——绘制含水层相对流速14.使用IDL进行氚羽流监测(二)——绘制3D地形和地下水位15.使用IDL进行氚羽流监测(一)——对研究区和环境进行建模16.【IDL】IDL8.8 安装中文语言包方法17.【IDL】IDL 8.7.1机器学习框架18.【IDL】IDL 8.7.1 新特性19.【IDL】获取參边形的最小外接矩形20.【IDL】图形保存图片时文字变黑块的临时解决方法21.【IDL】控制台使用Alt+/代码补全快捷键的方法22.【IDL】IDL 8.6新功能23.【IDL】 程序发布exe清晰步骤24.【IDL) 64位IDL中调用32位功能的方法25.【IDL】 去掉黄色警告图标的方法26.【IDL】 重写HDF文件中数据集的方法27.【IDL】无法使用格式快捷键的解决办法(Ctrl+ Shift+F)28.【IDL】IDL 8.5 中的颜色选择对话框29.【IDL】IDL 8.5 中的 Python Bridge30.【IDL】 开发环境(工作台)的语言切换万法
31.【IDL】IDL8.4 文件监视系统体验
32.【IDL】 批处理遇到错误时处理方法33.【IDL】开发游戏"2048"34.【IDL】IDL 8.4新特性介绍35.【IDL】IDL中乱码问题的解决方法36.【IDL】 自动构建泰森多边形(Voronoi Polygon)37.【IDL】 IDL 8.3 的新特性与新功能38.【IDL】 IDL 8.3 新功館39.2013开发竞赛ENV/IDL组作品欣赏——“伪装目标识别系统”40.【IDL】多元线性回归计算方法41.【IDL】 关键字继承42.【IDL】调用6S.exe生成查找表源码43.【IDL】使用WIDGET_TIMER进行动画控制44.【IDL】路径相关函数和方法汇总45.【IDL】绘图组件打开鼠标拖拽文件的方法46.【IDL】遠取文本中三維数組的方法47.【IDL】 IDL 8.2.2(SP2)新特性48.【IDL】IDL程序发布方法总结49.【IDL】宏命令菜单(Macros)的用处50.【IDL】 使用SPAWN启动路径中带有空格的文件51.【IDL】 实现双重排序功能(更新降序)52.【IDL】 C#调用ENVL_FX_SEGMENTONLY_DOIT需要注意的地方53.【IDL】 IDL 8.2 新增视频对象IDLffVideoWrite用法示例54.【IDL】生成等差/等比数列的方法55.【IDL】 判断双精度变量是合EQ56.【IDL】 File_Search函数用法详解57.【IDL】坐标轴中文标题乱码问题58.【IDL】C#调用IDL编写界面(含事件)的问题59.《IDL程序设计—数据可视化与ENV二次开发》目录60.《IDL程序设计—数据可视化与ENVI二次开发》已由高等教育出版社正式出版61.IDL Viewer 应用模版介绍(版本号更新为1.2)62.【IDL】日期和时间函数63.【IDL】数组求交集、并集和差集的函数64.【IL】IDL 8.2 新特性65.【IDL】 气象可视化程序配置(idL_guide5)66.【转】几个IDL在线教程网址67.【IDL】医学中IDL的应用68.【IDL】气象中IDL的应用69.【IDL】SIZE函数使用方法与参数含义详解70.【IDL】 DICOM扩展模块71.【IDL】几何图形数学运算函数72.【IDL】 弹出界面事件响应示例程序73.【IDL】鼠标信息显示界面(同理可实现鹰眼图等)74.【IDL】 IDL与C#混合编程技术75.【IDL〕编写程序启动界面76.【IDL】获取n*n数组的对角线元素的方法77.【IDL】同时显示不同分辨率图像的方法78.【IDL】帮助科学家了解太阳系的形成79.【IDL】 Polyval函数(多项式的估值)80.【IDL】 数组下标转换一维坐标索引函数:array_indices_reverse81.【IDL】数据处理时遇到了NAN怎么办82.ENVI二次开发时的波段运算表达式语句合理性检测方法与ENVI检测方法探讨83.【IDL】编写高效率的IDL程序84.【IDL】实现ENVI默认显示效果(线性拉伸算法)85.【IDL】双视图关联示例86.【IDL】图像真彩色、假彩色和伪彩色显示87.【IDL】国外学习与开源网站汇总88.【IDL】 如何保存IDL绘制的图像或图形89.【IDL】学习书籍《Modern IDL》90.【IDL】 读写Excel的方法总结91.【IDL】 绘制颜色棒 (colorbar)92.【IDL】 IDL8.1新功能介绍93.【IDL】 讨论浮点运算精度问题 (IDL与Excef和Matlab相比)94.【IDL】 图像显示程序(直接图形法与对象图形法混合显示)95.【IDL】 IDL Advanced及其详细功能介绍96.【IDL】自定义鼠标光标样式(直接图形法与对象图形法)97.【IDL】多条件判断的另类写法(case代替i)98.2014年IDL培训班素材包及录屏共享99.IDL中开发游戏“2048”100.ENVI 6.0自助试用许可开放申请IDL 8.4新增的 FOLDERWATCH 函数可以实现监视文件夹的功能。当文件夹发生变化时,会自动调用用户自定义的回调函数。
这里就和大家一起来体验一下 FOLDERWATCH的功能。从帮助中,我们可以获知此函数其实是一个类,具备如下几种方法:
- FolderWatch::Init —— 对象初始化
- FolderWatch::Check —— 检查是否正在监视某文件夹
- FolderWatch::Start —— 开始监视指定文件夹
- FolderWatch::Stop —— 停止监视
具体用法可参考帮助内容。
下面以一个具体实例演示FOLDERWATCH函数的功能。在此代码中,具备人机交互界面,可以实现如下功能:
- 输入监视路径:单击此按钮,在弹出面板中选择要监视的文件夹路径,会显示在后方的文本控件中。
- 开始监视:单击此按钮,开始监视指定文件夹。
- 停止监视:单击此按钮,停止监视指定文件夹。
- 日志列表:在日志列表中,可以看到对指定文件夹内文件的操作情况(修改、删除和添加)。右键菜单“清除日志”可以清除日志列表。
- 状态栏:显示目前监视状态,如正在监视中、已停止监视。
通过此代码可以学习如下IDL开发知识:
1. 用户界面搭建方法、居中显示界面等;
2. 事件处理方法,如按钮事件与状态设置、右键菜单实现方法、程序关闭事件等;
3. Folderwatch 函数使用方法;
4. LIST 链表使用方法;
5. IDL中时间和日期相关处理函数,以及字符串处理技巧。
如下图所示,为程序运行效果图。
图:测试效果图
源代码下载地址:http://pan.baidu.com/s/1kTmRKj1
附源代码如下:
;+
; :Description:
; 测试 IDL 8.4 新增的文件监视系统.
;
; :Author: duhj@esrichina.com.cn
;-
PRO example_folderwatch_event, ev
;
COMPILE_OPT idl2
; 获取信息
WIDGET_CONTROL, ev.TOP, GET_UVALUE=pState
; 判断事件类型
tag_name = TAG_NAMES(ev, /STRUCTURE_NAME)
; 在关闭窗体时的事件处理
CASE tag_name OF
'WIDGET_KILL_REQUEST': BEGIN
; 关闭程序事件
result = DIALOG_MESSAGE('是否停止监视,并退出?',/QUESTION)
CASE result OF
'Yes': BEGIN
; 如果 Folderwatch 对象有效,则停止监测,并销毁对象
IF OBJ_VALID(((*pState).FW)) THEN BEGIN
((*pState).FW).STOP
OBJ_DESTROY, (*pState).FW
ENDIF
; 退出系统
WIDGET_CONTROL, ev.TOP, /DESTROY
END
'No':
ELSE:
ENDCASE
RETURN
END
; 右键菜单
'WIDGET_CONTEXT': BEGIN
contextBase = WIDGET_INFO(ev.TOP, find_by_uname = 'contextMenu')
WIDGET_DISPLAYCONTEXTMENU, ev.ID, ev.X, ev.Y, contextBase
END
ELSE:
ENDCASE
; 通过 uname 进行事件处理
uname = WIDGET_INFO(ev.ID, /UNAME)
;
CASE uname OF
; "开始监视"按钮响应事件
'Start': BEGIN
; 获取监测文件夹路径
WIDGET_CONTROL, (*pState).WTEXTPATH, GET_VALUE=inPath
IF inPath EQ '' THEN RETURN
; 初始化监测对象,开始监测
FW = FOLDERWATCH(inPath, 'MyCallback', /RECURSIVE, $
USER_DATA=ev.TOP)
(*pState).FW = FW
; 设置对应按钮状态(可用或不可用),以及当前监视状态
WIDGET_CONTROL, (*pState).WSTART, SENSITIVE=0
WIDGET_CONTROL, (*pState).WSTOP, SENSITIVE=1
WIDGET_CONTROL, (*pState).WSTATUS, set_value='状态:正在监视中...'
END
; "停止监视"按钮响应事件
'Stop': BEGIN
; 设置对应按钮状态(可用或不可用),以及当前监视状态
WIDGET_CONTROL, (*pState).WSTOP, SENSITIVE=0
WIDGET_CONTROL, (*pState).WSTART, SENSITIVE=1
WIDGET_CONTROL, (*pState).WSTATUS, set_value='状态:已停止监视'
; 停止监测
((*pState).FW).STOP
END
; "输入监视路径"按钮响应事件
'Input': BEGIN
; 通过对话框选择需要监视的文件夹路径
inPath = DIALOG_PICKFILE(TITLE='选择需要监视的文件夹', $
/DIRECTORY)
IF inPath EQ '' THEN RETURN
; 将路径显示在 文本框 中
WIDGET_CONTROL, (*pState).WTEXTPATH, SET_VALUE=inPath
END
; 日志列表右键菜单"清除日志"按钮响应事件
'Clear': BEGIN
;
((*pState).LOGS).REMOVE, /all
; 将日志信息显示在 WIDGET_LIST 中
WIDGET_CONTROL, (*pState).WLOGLIST, SET_VALUE=''
END
ELSE:
ENDCASE
END
;文件监视回调函数
PRO MyCallback, obj, data
COMPILE_OPT IDL2
; 计算当前日期,并格式化为 字符串 类型,用于日志输出
caldat,SYSTIME(/julian),month,day,year,hour,minute,second
date = [year,month,day]
time = [hour,minute,second]
datestr = STRJOIN(STRTRIM(date, 2), '-')
timestr = STRJOIN(STRING(FIX(time), FORMAT='(I02)'), ':')
; 对字符串进行处理
ret = datestr + " " + timestr + ""
; 判断文件的3中操作类型
IF data.ADDED THEN ret += ' 添加操作 '
IF data.MODIFIED THEN ret += ' 修改操作 '
IF data.REMOVED THEN ret += ' 移除操作 '
ret += '"'+data.FILE+'"'
; 在 Folderwatch 的 User_data 中存储了 ev.top,获取信息
WIDGET_CONTROL, obj.USER_DATA, GET_UVALUE=pState
; 将当前状态字符串添加到 历史记录 中
((*pState).LOGS).ADD, ret
; 日志信息由 List 转换为 字符串数组
Logs = ((*pState).LOGS).toarray()
; 将日志信息显示在 WIDGET_LIST 中
WIDGET_CONTROL, (*pState).WLOGLIST, SET_VALUE= Logs, $
SET_LIST_TOP=(((*pState).LOGS).Count()-15)
END
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; MAIN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PRO example_folderwatch
COMPILE_OPT IDL2
; 构建主界面
FONT = 'Microsoft Yahei*18'
tlb = WIDGET_BASE(title='IDL中的文件监视系统', /COLUMN, $
XOFFSET=500, YOFFSET=300, TLB_FRAME_ATTR=1, $
/TLB_KILL_REQUEST_EVENTS, map=0)
wBase = WIDGET_BASE(tlb, /ROW)
wPath = WIDGET_BUTTON(wBase, VALUE='输入监视路径', $
UNAME='Input', FONT=FONT)
wTextPath = WIDGET_TEXT(wBase, VALUE='', XSIZE=65, $
FONT=FONT)
wStart = WIDGET_BUTTON(wBase, VALUE='开始监视', $
UNAME='Start', FONT=FONT)
wStop = WIDGET_BUTTON(wBase, VALUE='停止监视', $
UNAME='Stop', SENSITIVE=0, FONT=FONT)
wLogList = WIDGET_LIST(tlb, YSIZE=15, XSIZE=110, $
FONT=FONT, /CONTEXT_EVENTS)
; 右键菜单,用于清除日志
contextBase = WIDGET_BASE(wLogList, /CONTEXT_MENU, $
UNAME='contextMenu')
wClear = WIDGET_BUTTON(contextBase, VALUE=' 清除日志', $
UNAME='Clear', FONT=FONT)
wStatus = WIDGET_LABEL(tlb, VALUE='状态:已停止监视', $
/ALIGN_LEFT, FONT=FONT)
WIDGET_CONTROL, tlb, /REALIZE
; 居中显示界面
DEVICE, get_screen_size=ss
info = WIDGET_INFO(tlb, /GEOMETRY)
tlb_XY = [info.SCR_XSIZE, info.SCR_YSIZE]
offset = [ss-tlb_XY]/2
WIDGET_CONTROL, tlb, XOFFSET=offset[0],$
YOFFSET=offset[1]
WIDGET_CONTROL, tlb, /map
; 将需要的信息保存在tlb的uvalue中
pState = {WPATH:wPath, $
WTEXTPATH:wTextPath, $
WSTART:wStart, $
WSTOP:wStop, $
WLOGLIST:wLogList, $
WSTATUS:wStatus, $
FW:OBJ_NEW(), $
LOGS:LIST()}
WIDGET_CONTROL, tlb, SET_UVALUE=PTR_NEW(pState)
; 事件管理
XMANAGER, 'example_folderwatch', tlb, /NO_BLOCK
END
合集:
地理遥感生态网地理数据集5
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)