发表回复 
如何读取文本列出文件列表?
2010-06-06, 22 : 17
如何读取文本列出文件列表?
在帮助文件ListView中的最后一个例子里,可以实现列出某个文件夹中的文件(包括大小,类型等),我想改下使它能够读取一个TXT文本,里面每行都是一堆文件的绝对​路径,如
E:\FDF.MP3
D:\文件\FD.PHP
然后列出这些文件的文件名列表、绝对路径列表,大小,类型,创建时间,右键菜单中要增加复制文件名、绝对路径、打开文件所在文件夹功能

求赐教
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2010-06-06, 22 : 25
 
什么意思????
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2010-06-06, 22 : 49
 
代码: (全选)
; 从所选文件夹增加文件列表并附加到ListView:
GuiControl, -Redraw, MyListView  ; 通过载入时禁止拖动来优化性能。
FileRead,files,%file%
Loop, Parse,files,`n,`r
{
    FileName := A_LoopField  ; 必须把它存入一个可写的变量中以供下面使用。
        FileGetSize,size,%FileName%
    ; 构建一个唯一的扩展名ID来避免字符在变量名中不合法,例如破折号。
    ; 这种唯一ID的方法表现的更好,因为在数组中寻找一个数据不需要循环搜索。
    SplitPath, FileName,filename_nopath,dir, FileExt  ; 分解路径,获得文件的扩展名。
    if FileExt in EXE,ICO,ANI,CUR
    {
        ExtID := FileExt  ; 用特殊的ID做标志。
        IconNumber = 0  ; 标记为无法找到,这样这些类型就可以有唯一的图标。
    }
    else  ; 一些其他的文件类型,计算它们的唯一ID。
    {
        ExtID = 0  ; 初始化处理那些较短的扩展名。
        Loop 7     ; 限制扩展名为7个字符以便符合一个64比特的变量。
        {
            StringMid, ExtChar, FileExt, A_Index, 1
            if not ExtChar  ; 没有字符了。
                break
            ; 通过给每个字符分配一个另外的比特位来获得唯一的ID:
            ExtID := ExtID | (Asc(ExtChar) << (8 * (A_Index - 1)))
        }
        ; 检查这种文件类似在是否已经存在于图像列表中。
        ; 如果有,几个calls将可以省略,这将大大的优化性能,
        ; 尤其是在处理一个包含数百文件的文件夹时:
        IconNumber := IconArray%ExtID%
    }
    if not IconNumber  ; 没有现成的扩展名图标, 那么,载入。
    {
        ; 获得一个关联此文件的高质量的小图标:
        if not DllCall("Shell32\SHGetFileInfoA", "str", FileName, "uint", 0, "str", sfi, "uint", sfi_size, "uint", 0x101)  ; 0x101 是 SHGFI_ICON+SHGFI_SMALLICON
            IconNumber = 9999999  ; 设置一个超出界限的值来显示一个空白图标。
        else ; 图标成功载入。
        {
            ; Extract the hIcon member from the structure:
            hIcon = 0
            Loop 4
                hIcon += *(&sfi + A_Index-1) << 8*(A_Index-1)
            ; Add the HICON directly to the small-icon and large-icon lists.
            ; Below uses +1 to convert the returned index from zero-based to one-based:
            IconNumber := DllCall("ImageList_ReplaceIcon", "uint", ImageListID1, "int", -1, "uint", hIcon) + 1
            DllCall("ImageList_ReplaceIcon", "uint", ImageListID2, "int", -1, "uint", hIcon)
            ; Now that it's been copied into the ImageLists, the original should be destroyed:
            DllCall("DestroyIcon", "uint", hIcon)
            ; Cache the icon to save memory and improve loading performance:
            IconArray%ExtID% := IconNumber
        }
    }

    ; Create the new row in the ListView and assign it the icon number determined above:
    LV_Add("Icon" . IconNumber, filename_nopath, dir, size, FileExt)
}
主要是这部分,修改下就可以了,响应的按钮名字修改,folder→file
不改不影响效果



完整的:
代码: (全选)
; 通过指定行数为0来选择或反选所有行:
LV_Modify(0, "Select")   ; 全选
LV_Modify(0, "-Select")  ; 反选全部
LV_Modify(0, "-Check")  ; 取消勾选所有的复选框


; 自动调整每列以适应其内容:
LV_ModifyCol()  ; 这个模式没有参数。



; 主要例子
; 下面这个脚本比本页开始那个要复杂很多。
; 显示用户所选择文件夹中的文件,并显示每个文件的文件类型图标。
; 用户可以双击一个文件,或者右击一个或多个文件来弹出一个右键菜单。

; 允许用户最大化和调整窗口大小:
Gui +Resize

; 创建一些按钮:
Gui, Add, Button, Default gButtonLoadfile, Load a file
Gui, Add, Button, x+20 gButtonClear, Clear List
Gui, Add, Button, x+20, Switch View

; 创建一个ListView:
Gui, Add, ListView, xm r20 w700 vMyListView gMyListView, Name|In Folder|Size (KB)|Type
LV_ModifyCol(3, "Integer")  ; 以便排序, 将Size列定为整型。

; Create an ImageList so that the ListView can display some icons:
ImageListID1 := IL_Create(10)
ImageListID2 := IL_Create(10, 10, true)  ; A list of large icons to go with the small ones.

; Attach the ImageLists to the ListView so that it can later display the icons:
LV_SetImageList(ImageListID1)
LV_SetImageList(ImageListID2)

; 创建一个作为右键菜单的弹出菜单:
Menu, MyContextMenu, Add, Open, ContextOpenFile
Menu, MyContextMenu, Add, Properties, ContextProperties
Menu, MyContextMenu, Add, Clear from ListView, ContextClearRows
Menu, MyContextMenu, Default, Open  ; 使 “Open” 使用粗体显示,并且为双击默认事件。

; 显示一个窗口然后返回。
; 当用户执行一个符合要求的动作时系统会通知脚本:
Gui, Show
return


ButtonLoadFile:
Gui +OwnDialogs  ; 强制用户使用主窗口前关闭下面的对话框。
FileSelectFile, File,,, Select a file to read:
if not File  ; 用户取消了对话框。
    return

; 检查文件名(Folder)的最后一个字符是不是“\”,这经常发生在像C:\这样的根目录。
;~ ; 如果是,移除,以防止后面出现两个“\”的现象。
;~ StringRight, LastChar, Folder, 1
;~ if LastChar = \
;~     StringTrimRight, Folder, Folder, 1  ; 移除尾部的反斜杠“\”。

; 确保变量有足够的内存空间来存储最长的文件路径。
;~ ; 这样做是因为ExtractAssociatedIconA()需要储存一个新的文件名到里面。
VarSetCapacity(Filename, 260)
sfi_size = 352
VarSetCapacity(sfi, sfi_size)

; 从所选文件夹增加文件列表并附加到ListView:
GuiControl, -Redraw, MyListView  ; 通过载入时禁止拖动来优化性能。
FileRead,files,%file%
Loop, Parse,files,`n,`r
{
    FileName := A_LoopField  ; 必须把它存入一个可写的变量中以供下面使用。
    FileGetSize,size,%FileName%
    ; 构建一个唯一的扩展名ID来避免字符在变量名中不合法,例如破折号。
    ; 这种唯一ID的方法表现的更好,因为在数组中寻找一个数据不需要循环搜索。
    SplitPath, FileName,filename_nopath,dir, FileExt  ; 分解路径,获得文件的扩展名。
    if FileExt in EXE,ICO,ANI,CUR
    {
        ExtID := FileExt  ; 用特殊的ID做标志。
        IconNumber = 0  ; 标记为无法找到,这样这些类型就可以有唯一的图标。
    }
    else  ; 一些其他的文件类型,计算它们的唯一ID。
    {
        ExtID = 0  ; 初始化处理那些较短的扩展名。
        Loop 7     ; 限制扩展名为7个字符以便符合一个64比特的变量。
        {
            StringMid, ExtChar, FileExt, A_Index, 1
            if not ExtChar  ; 没有字符了。
                break
            ; 通过给每个字符分配一个另外的比特位来获得唯一的ID:
            ExtID := ExtID | (Asc(ExtChar) << (8 * (A_Index - 1)))
        }
        ; 检查这种文件类似在是否已经存在于图像列表中。
        ; 如果有,几个calls将可以省略,这将大大的优化性能,
        ; 尤其是在处理一个包含数百文件的文件夹时:
        IconNumber := IconArray%ExtID%
    }
    if not IconNumber  ; 没有现成的扩展名图标, 那么,载入。
    {
        ; 获得一个关联此文件的高质量的小图标:
        if not DllCall("Shell32\SHGetFileInfoA", "str", FileName, "uint", 0, "str", sfi, "uint", sfi_size, "uint", 0x101)  ; 0x101 是 SHGFI_ICON+SHGFI_SMALLICON
            IconNumber = 9999999  ; 设置一个超出界限的值来显示一个空白图标。
        else ; 图标成功载入。
        {
            ; Extract the hIcon member from the structure:
            hIcon = 0
            Loop 4
                hIcon += *(&sfi + A_Index-1) << 8*(A_Index-1)
            ; Add the HICON directly to the small-icon and large-icon lists.
            ; Below uses +1 to convert the returned index from zero-based to one-based:
            IconNumber := DllCall("ImageList_ReplaceIcon", "uint", ImageListID1, "int", -1, "uint", hIcon) + 1
            DllCall("ImageList_ReplaceIcon", "uint", ImageListID2, "int", -1, "uint", hIcon)
            ; Now that it's been copied into the ImageLists, the original should be destroyed:
            DllCall("DestroyIcon", "uint", hIcon)
            ; Cache the icon to save memory and improve loading performance:
            IconArray%ExtID% := IconNumber
        }
    }

    ; Create the new row in the ListView and assign it the icon number determined above:
    LV_Add("Icon" . IconNumber, filename_nopath, dir, size, FileExt)
}
GuiControl, +Redraw, MyListView  ; 重新启动拖动(上面禁用了)。
LV_ModifyCol()  ; 自动调整每列以适应其内容。
LV_ModifyCol(3, 60) ; 稍微调大列的大小,使列标题完全显示出来。
return


ButtonClear:
LV_Delete()  ; 清空列表,但为了简单起见,图标缓存完整地保存。
return

ButtonSwitchView:
if not IconView
    GuiControl, +Icon, MyListView    ; 切换到图标视图。
else
    GuiControl, +Report, MyListView  ; 切换回详细列表视图。
IconView := not IconView             ; 取反,以便下次使用。
return

MyListView:
if A_GuiEvent = DoubleClick  ; 脚本可以检测许多其他可能的值。
{
    LV_GetText(FileName, A_EventInfo, 1) ; 获取第一字段(列)中的文本。
    LV_GetText(FileDir, A_EventInfo, 2)  ; 获取第二字段(列)中的文本。
    Run %FileDir%\%FileName%,, UseErrorLevel
    if ErrorLevel
        MsgBox Could not open "%FileDir%\%FileName%".
}
return

GuiContextMenu:  ; 当右击或者按下应用程序键(译者按:键盘右win键和Ctrl键中间的那个)时启动。
if A_GuiControl <> MyListView  ; 只有在ListView中右击时才显示此菜单。
    return
; 在系统提供的坐标(A_GuiX 和 A_GuiY)处显示菜单。
; 这是因为这样即使用户通过应用程序键触发也能得到正确的坐标:
Menu, MyContextMenu, Show, %A_GuiX%, %A_GuiY%
return

ContextOpenFile:  ; 用户在菜单中选择了“Open”。
ContextProperties:  ; 用户在菜单中选择了“Properties(属性)”。
; 简单起见,操作仅在焦点行发生而不是所有被选中的行:
FocusedRowNumber := LV_GetNext(0, "F")  ; 找到焦点所在行。
if not FocusedRowNumber  ; 没有焦点行。
    return
LV_GetText(FileName, FocusedRowNumber, 1) ; 获取第一部分(列)中的文本。
LV_GetText(FileDir, FocusedRowNumber, 2)  ; 获取第二部分(列)中的文本。
IfInString A_ThisMenuItem, Open  ; 用户在菜单中选择了“Open”。
    Run %FileDir%\%FileName%,, UseErrorLevel
else  ; 用户在菜单中选择了“Properties(属性)”。
    Run Properties "%FileDir%\%FileName%",, UseErrorLevel
if ErrorLevel
    MsgBox Could not perform requested action on "%FileDir%\%FileName%".
return

ContextClearRows:  ; 用户在菜单中选择了“Clear(删除当前行)”。
RowNumber = 0  ; 这将使第一次迭代搜索发生在列表顶部。
Loop
{
    ; 因为删除一行讲使该行下面的所有行行数减1,
    ; 所以有相同行数的行要被事先找到(以防出现临近的行同时被选择的情况):
    RowNumber := LV_GetNext(RowNumber - 1)
    if not RowNumber  ; 上面返回0,所以没有被选择的行。
        break
    LV_Delete(RowNumber)  ; 从ListView中删除指定行。
}
return

GuiSize:  ; 根据用户调整的窗口大小放大或缩小ListView。
if A_EventInfo = 1  ; 窗口被最小化,没有调整的必要。
    return
; 否则,窗口被最大化或者调整大小,相应调整ListView的大小。
GuiControl, Move, MyListView, % "W" . (A_GuiWidth - 20) . " H" . (A_GuiHeight - 40)
return

GuiClose:  ; 当窗口被关闭,自动退出程序:
ExitApp

所有脚本存至项目: https://github.com/health901/AHK, 欢迎fork
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2010-06-16, 21 : 00
 
[i=s] 本帖最后由 jsttking0123 于 2010-6-16 21:02 编辑 [/i]

非常好,赞一个!
现在我想在上面加一个输入框,每输入一个字符,就将已输入的字符(比如ppedit)实时地发送到一个命令工具中(比如run,cmd /k ask ppedit >sone.txt 这是个如上所述包含绝对地址的文本),然后sleep 100就自动Load 那个sone.txt,如何办到?
现在载入文本时有些慢,可否再快点?那个列表中四列Name,In Folder,Size,type宽度不能固定啊,总是随着文件名的长度而变化。还有就是能不能加进创建时间和修改时间啊?
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2010-06-16, 21 : 16
 
你这样资源消耗太大了吧。
实时同步cmd是办不到的了,必须是完整一句命令之后然后才反馈到cmd里产生结果。
你的想法就是从sone.txt里load路径,然后加载到listview里。。。
那样的话,会出现重复项,必须load之前lv_delete(),然后你就会感觉整个LV在狂闪。。。

宽度能指定为常数,修改事件那些也只是多个列的问题,没有什么好讲的。
涉及到命令FileGetTime
在“我要翻译”板块里下载最新的翻译档,看下LV的操作
http://ahk.5d6d.com/thread-1865-1-1.html

所有脚本存至项目: https://github.com/health901/AHK, 欢迎fork
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2010-06-16, 21 : 32
 
先谢过了
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2010-06-16, 21 : 43
 
[i=s] 本帖最后由 jsttking0123 于 2010-6-16 22:17 编辑 [/i]

我加了个
Gui, Add, edit,x+20 W240 vMyEdit
Gui, Add, Button, x+20,OK


ButtonOk:
FileDelete,R:\TEMP\sone.txt
Gui submit
Gui show
run,cmd /k ask %MyEdit% >R:\TEMP\sone.txt ,,hide
sleep 500
loop
{
IfExist, R:\TEMP\sone.txt
break
}
sleep 500
LV_Delete()
File = R:\TEMP\sone.txt

; 检查文件名(Folder)的最后一个字符是不是“\”,这经常发生在像C:\这样的根目录。
;~ ; 如果是,移除,以防止后面出现两个“\”的现象。
下面接你上面的代码


可否用回车替代OK按钮
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2010-06-16, 22 : 22
 
[i=s] 本帖最后由 jsttking0123 于 2010-6-16 22:33 编辑 [/i]

按name排序时文件夹能不能单独排在一起,不要和文件混在一起分不开?
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2010-06-16, 22 : 25
 
ahk 有没有多标签功能啊,像浏览器那样的,好想把上面的加个多标签啊
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2010-06-16, 22 : 31
 
[i=s] 本帖最后由 health901 于 2010-6-16 22:34 编辑 [/i]

引用:可否用回车替代OK按钮?
这个可以这样做,加个button,然后加属性default,hide,这样按回车就默认按下button,但是button看不见,就好像是回车执行了。

排序问题应该不行

标签,指什么?Tab?

所有脚本存至项目: https://github.com/health901/AHK, 欢迎fork
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2010-06-16, 22 : 37
 
[i=s] 本帖最后由 jsttking0123 于 2010-6-17 02:41 编辑 [/i]

就是可以打开多个实例排在一起,也就是多窗口

代码: (全选)
Gui, Add, Tab2,, 第一页|第二页|第三页 ; 该控件需要 v1.0.47.05 版本
Gui, Add, Checkbox, vMyCheckbox, 一个复选框
Gui, Tab, 2
Gui, Add, Radio, vMyRadio, 单选框1
Gui, Add, Radio,, 单选框2
Gui, Tab, 3
Gui, Add, Edit, vMyEdit r5 ; r5 表示总共有5行
Gui, Tab ; 表示之后创建的控件不属于属性页控件
Gui, Add, Button, default xm, OK ; xm 表示把该控件显示在窗体的左下角
Gui, Show
return
ButtonOK:
GuiClose:
GuiEscape:
Gui, Submit ; 保存每个与控件相关联的变量MsgBox 你选择了:`n%MyCheckbox%`n%MyRadio%`n%MyEdit%
ExitApp
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
[+] 1用户表示感谢jsttking0123
2010-06-16, 22 : 38
 
[i=s] 本帖最后由 jsttking0123 于 2010-6-17 03:10 编辑 [/i]

文本后面多了一个回车,如何删除

如果文本大于10kb(差不多包含200多个文件列表),载入速度就有点慢了,更别说几百KB的了,请问这个怎么优化?
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2010-06-17, 02 : 45
 
listview的右键菜单功能有点痤,我想直接用系统自带的右键菜单,并再加些项目,可以不?
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2010-06-17, 07 : 27
 
[i=s] 本帖最后由 health901 于 2010-6-17 07:30 编辑 [/i]

删除最后一个回车
stringtrimright,txt,txt,1

载入速度慢,用Loop, Read, InputFile [, OutputFile]试试

没有现成的右键菜单,都要自己写

所有脚本存至项目: https://github.com/health901/AHK, 欢迎fork
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2010-06-17, 12 : 56
 
我想定位指定文件,为什么多了个参数/select 就不能运行
代码: (全选)
run,cmd /k explorer.exe /select,%FileDir%\%FileName% && exit ,,hide
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2010-06-17, 13 : 34
 
知道了,把/select,换成/select`,就好了
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2017-10-02, 11 : 14
RE: 如何读取文本列出文件列表?
(2010-06-16 22 : 37)jsttking0123 提到:  [i=s] 本帖最后由 jsttking0123 于 2010-6-17 02:41 编辑 [/i]

就是可以打开多个实例排在一起,也就是多窗口

代码: (全选)
Gui, Add, Tab2,, 第一页|第二页|第三页 ; 该控件需要 v1.0.47.05 版本
Gui, Add, Checkbox, vMyCheckbox, 一个复选框
Gui, Tab, 2
Gui, Add, Radio, vMyRadio, 单选框1
Gui, Add, Radio,, 单选框2
Gui, Tab, 3
Gui, Add, Edit, vMyEdit r5 ; r5 表示总共有5行
Gui, Tab ; 表示之后创建的控件不属于属性页控件
Gui, Add, Button, default xm, OK ; xm 表示把该控件显示在窗体的左下角
Gui, Show
return
ButtonOK:
GuiClose:
GuiEscape:
Gui, Submit ; 保存每个与控件相关联的变量MsgBox 你选择了:`n%MyCheckbox%`n%MyRadio%`n%MyEdit%
ExitApp

这个多窗口脚本不错,借鉴一下。
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
发表回复 


论坛跳转:


联系我们 | Autohotkey 中文站 | 回到顶部 | 回到正文区 | 精简(归档)模式 | RSS 聚合