注册 登录
编程论坛 VFP论坛

请教制作文件管理软件的思路

fanjinyu9108 发布于 2022-01-25 18:27, 4746 次点击
想制作一个文件管理软件,要求在公司的内网都可以查询和使用。我的思路是这样的,
     思路一 使用SQLserver数据库建立一个表,表的字段有2个,一个是文件的标题或者提示,另外一个字段是文件在服务器的位置及名称,文件的名称以ID号命名,这就保证了文件名字的唯一性。文件管理员负责添加记录,每添加一条记录,就可以上传一个文件到服务器,然后将名字命名为ID号。文件使用者就查询这个表,点击某条记录,客户端就找到服务器对应的文件,然后下载到本地的临时文件夹,打开,文件浏览完毕,关闭文件,自动删除临时文件。
    思路二 使用SQLserver数据库建立一个表,表的字段有2个,一个是文件的标题或者提示,另外一个字段是存储文件,但是我不知道SQL数据库的字段是否能存储WORD,EXCEL,PDF等格式的
文件,其他功能和思路一类似。
    请教哪个思路可以比较容易实现。

[此贴子已经被作者于2022-1-25 18:35编辑过]

35 回复
#2
fanjinyu91082022-01-25 19:38
补充说明一下,网络环境是在公司的局域网内使用,每台客户端的电脑都有固定IP。顺便说明,我不想让存放文件的文件夹成为共享文件夹,或者即使是共享文件夹,也必须设定用户和密码,VFP程序通过用户名和密码获得访问权限才能存储文件和浏览文件。

[此贴子已经被作者于2022-1-25 19:42编辑过]

#3
fanjinyu91082022-01-25 19:46
论坛里找到了一个答案:
**本地文件copy到服务器制定目录位置**
AAA=GETFILE("pdf")       &&原始文件位置,里面的pdf可以修改成你需要的格式
mulu="\\192.168.1.2\fold"  &&目标目录
bbb=mulu+JUSTFNAME(aaa)    &&目标文件及其位置
copy file &aaa to &bbb     &&复制命令

这个答案是假设目标目录是不需要密码的共享文件夹,但我不想这样随便访问。
#4
laowan0012022-01-25 19:58
* 远程表结构
CREATE TABLE FileList (id varchar(50),title varchar(30),filename varchar(30),filetype varchar(10),filetext varchar(max))


程序代码:
* 保存文件时
LOCAL xfilename,xfiletext
xfilename = GETFILE('DOCX,XLSX,PDF')
xfiletext = strconv(FILETOSTR(xfilename),13)
* 用SQL语句把xfiletext保存到sqlserver表中


程序代码:

* 读取文件时
LOCAL xid,xsql,xfilename
* xid 根据条件确定的文件id
* 执行SQL语句,读取远程文件
xsql = "SELECT * FROM FileList WHERE id='&xid'"
* 假设SQL执行结果保存到本地临时表xxx
SELECT &xxx
xfilename = '本地文件名'+'.扩展名'    && 根据filetype确定扩展名
strtofile(strconv(alltrim(filetext),14),xfilename)


[此贴子已经被作者于2022-1-25 20:02编辑过]

#5
吹水佬2022-01-25 20:23
局域网(F/S)直接读写文件就可以,简单方便。
可以通过程序动态将共享文件夹影射到本地盘符,也可以不映射为盘符(空连接),使用完毕断开连接。


#6
fanjinyu91082022-01-25 21:13
非常感谢laowan001和吹水佬两位版主的热心解答,我现在在外面,暂时无法验证laowan001版主的程序,吹水佬版主,您说的映射如何实现,能详细些吗?
#7
吹水佬2022-01-26 10:23
以下是引用fanjinyu9108在2022-1-25 21:13:35的发言:

映射如何实现

简单用CMD命令:net use,详细参考帮助 net use /?

DECLARE LONG WinExec IN kernel32 STRING@, LONG
WinExec([net use Z: \\192.168.1.1\test abcd 123], 0)

#8
fanjinyu91082022-01-26 13:17
吹水佬版主,您的方法我暂时不去验证,我测试了laowan001版主的方法,通过了,但是又遇到一个问题,领导要求读取文件时能否不存盘到本地,直接打开?怎么实现?急求laowan001版主
#9
laowan0012022-01-26 13:33
以下是引用fanjinyu9108在2022-1-26 13:17:55的发言:

吹水佬版主,您的方法我暂时不去验证,我测试了laowan001版主的方法,通过了,但是又遇到一个问题,领导要求读取文件时能否不存盘到本地,直接打开?怎么实现?急求laowan001版主

这个把我难住了,我觉得不能
#10
厨师王德榜2022-01-26 14:18
直接打开的话, 就相当于OA系统了,要花钱的, 或者你可以去获取像'金格软件' 那样的中间件,可以在Web页面中直接打开 OFFICE文档 .
#11
sych2022-01-26 14:38
如果再来个要求,打开后不能随意复制保存,难度又增加一级
#12
laowan0012022-01-26 14:44
以下是引用fanjinyu9108在2022-1-26 13:17:55的发言:

吹水佬版主,您的方法我暂时不去验证,我测试了laowan001版主的方法,通过了,但是又遇到一个问题,领导要求读取文件时能否不存盘到本地,直接打开?怎么实现?急求laowan001版主

领导的这个要求有点难为人了,试想就算是不保存到本地,那你还要防止“另存为”吧,就算这个也防住了,是不是还要防止阅读的人拍照呢,
是不是有点掩耳盗铃的意思
#13
sych2022-01-26 14:45
领导不花钱哪有资格提要求?
#14
吹水佬2022-01-26 15:31
以下是引用fanjinyu9108在2022-1-26 13:17:55的发言:

领导要求读取文件时能否不存盘到本地

F/S就不用考虑了,因其对远端视同本地。
#15
sych2022-01-26 15:56
可以转换成图片,内存加载
#16
sych2022-01-26 16:15
再加个水印
#17
fanjinyu91082022-01-26 17:37
好吧,这样也可以了,那能否退而求其次,在文件保存后再直接打开,请问用什么命令?
#18
吹水佬2022-01-26 18:50
看看这样能否满足要求
主机IP:192.168.1.7
主机名:abcd
主机密码:1234
共享名:temp
共享文件:test.txt
共享权限:读写
程序代码:
DECLARE long _strdup IN msvcrt as apiStrdup string@
DECLARE long free    IN msvcrt as apiFree long
DECLARE long WNetAddConnection2 IN mpr as apiWNetAddConnection2 string@,string@,string@,long
DECLARE long WNetCancelConnection2 IN mpr as apiWNetCancelConnection2 string@,long,long

cRemoteName = "\\192.168.1.7\temp"
IF myNetConnect(cRemoteName, "abcd", "1234")
    MODIFY FILE (cRemoteName+"\test.txt")
    apiWNetCancelConnection2(cRemoteName, 1, 1)
ENDIF
CLEAR ALL
RETURN

FUNCTION myNetConnect(cRemoteName, cUserName, cPassWord)
    LOCAL tNR, nRet, pRemoteName
    pRemoteName = apiStrdup(cRemoteName)
    tNR = REPLICATE(0h00,4) + BINTOC(1,"4RS") + REPLICATE(0h00,12);
        + BINTOC(pRemoteName,"4RS") + REPLICATE(0h00,8)
    nRet = apiWNetAddConnection2(@tNR, cPassWord, cUserName, 1)
    IF nRet == 1219
        apiWNetCancelConnection2(cRemoteName, 1, 1)
        nRet = apiWNetAddConnection2(@stNR, cPassWord, cUserName, 1)
    ENDIF
    apiFree(pRemoteName)
    IF nRet != 0
        MESSAGEBOX("连接失败:"+TRANSFORM(nRet), "提示")
    ENDIF
    RETURN (nRet == 0)
ENDFUNC





[此贴子已经被作者于2022-1-26 18:51编辑过]

#19
fanjinyu91082022-01-26 19:56
吹水佬版主,您写的代码是直接存储文件在文件夹的方式,这种方式在打开的时候需要拷贝文件到本地吗?说来惭愧,使用VFP有十多年了,居然版主写的程序看不懂。如果不需要拷贝,那就可能涉及共享打开,那么,假如是EXCEL文件,能允许多人同时打开吗?当然,我只需要浏览就可以了,不需要编辑,也不允许编辑。
#20
吹水佬2022-01-26 20:37
回复 19楼 fanjinyu9108
代码可以放到任何客户机,打开的文件是服务机的共享文件 \\192.168.1.7\temp\test.txt,不需要拷贝到本地。
示例用到 MODIFY FILE 命令,需要写权限。
用EXCEL可以只读,假设有文件 \\192.168.1.7\temp\Book1.xls
将 MODIFY FILE (cRemoteName+"\test.txt") 这句改为下面几句:
    oExcel = CREATEOBJECT("Excel.Application")
    oExcel.DisplayAlerts = 0
    oExcel.WorkBooks.Open(cRemoteName+"\Book1.xls")
    oExcel.Visible = 1
#21
schtg2022-01-26 21:02
学习啦,谢谢!
#22
fanjinyu91082022-01-26 21:43
吹水佬版主,您是说对于不同的文件类型,就要用不同的代码,那我的文件类型可能有多种啊,可能是WORD文件,BMP图片,甚至是视频文件,那都需要用不同的代码打开吗?还有,打开之前,是不是还需要判断文件类型啊
#23
吹水佬2022-01-26 22:41
以下是引用fanjinyu9108在2022-1-26 21:43:17的发言:

吹水佬版主,您是说对于不同的文件类型,就要用不同的代码,那我的文件类型可能有多种啊,可能是WORD文件,BMP图片,甚至是视频文件,那都需要用不同的代码打开吗?还有,打开之前,是不是还需要判断文件类型啊

有几多种? 都知道用什么程序打开的吧


#24
my23182022-01-26 23:11
回复 22楼 fanjinyu9108
我有一套电子文档管理系统的源程序,打算转让换台笔记本电脑,有兴趣可以联系,当然也可购买应用软件(不含源程序),且花费少。3.0的使用手册下载地址https://down.bccn.net/10366.html

[此贴子已经被作者于2022-1-26 23:39编辑过]

#25
my23182022-01-26 23:18
以下是引用fanjinyu9108在2022-1-26 21:43:17的发言:

吹水佬版主,您是说对于不同的文件类型,就要用不同的代码,那我的文件类型可能有多种啊,可能是WORD文件,BMP图片,甚至是视频文件,那都需要用不同的代码打开吗?还有,打开之前,是不是还需要判断文件类型啊


用户电脑只要安装了对应文件的打开程序可以直接下载打开,对于一种类型文件用哪个程序打开取决于用户电脑打开该类型文件的默认程序设置,如word文件可用word打开,也可用WPS打开,看用户设定word文件的默认打开程序是哪个。

[此贴子已经被作者于2022-1-26 23:36编辑过]

#26
my23182022-01-26 23:28
回复 22楼 fanjinyu9108
还有一套2.0的,使用手册下载地址https://down.bccn.net/10295.html,安全性较3.0要差一些。
#27
fanjinyu91082022-01-28 09:26
my2318师傅,您好,我看了下3.0的电子文档,感觉有点复杂,我的思路是越简单越好,只需要一个表格,一个条件框,一个按钮就行了。
#28
fanjinyu91082022-01-28 11:25
再请教一个问题,如果按照laowan001版主的方法,把文件存储在数据库里面,如何得出文件的类型,也就是后缀名?
#29
laowan0012022-01-28 11:56
后台表有个字段叫“filetype”,记录了保存时的源文件类型
#30
my23182022-01-28 15:51
回复 27楼 fanjinyu9108
建议有超前思维,当电子文档多时简单的管理方式就会感到不方便,建议按组织架构和文件分类组织文件管理,全员参与。
#31
fanjinyu91082022-01-29 08:00
laowan001版主,我知道filetype是记录源文件类型 类型,可是源文件类型怎么弄出来呢?
#32
laowan0012022-01-29 08:35
以下是引用fanjinyu9108在2022-1-29 08:00:53的发言:

laowan001版主,我知道filetype是记录源文件类型 类型,可是源文件类型怎么弄出来呢?

在保存文件的时候是知道源文件的扩展名,也就知道了文件类型,还原的时候还按照之前的文件类型(扩展名)保存下来即可
当然,如果源文件的扩展名与实际文件类型不符的这种非正常情况不在考虑范围之内
#33
独木星空2022-01-29 08:49
回复 楼主 fanjinyu9108
高级别的对话,只有学习的份。虽然作为会计这个行业也用的着,无奈时间不允许,暂时搁置。
#34
fanjinyu91082022-01-29 21:20
laowan001版主,您好,我现在的问题就是在存盘的时候不知道文件类型怎么去知道,是根据文件全名从右往左第一次出现“.”,然后截取“.”后面的字节作为后缀名保存到filetype字段里面吗?
#35
laowan0012022-01-30 08:33
以下是引用fanjinyu9108在2022-1-29 21:20:51的发言:

laowan001版主,您好,我现在的问题就是在存盘的时候不知道文件类型怎么去知道,是根据文件全名从右往左第一次出现“.”,然后截取“.”后面的字节作为后缀名保存到filetype字段里面吗?


上传文件的时候是要选择一个文件吧,文件的扩展名应该是知道的,那么就应该知道文件类型了,比如:DOC、DOCX是word文档,XLSX是EXCEL表格,这些是可以穷举的。(这里不考虑扩展名与实际文件类型不匹配的情况)
建议保存扩展名(或另外的字段保存扩展名),这样恢复的时候不会有版本高低的问题
VFP9参见取扩展名函数:JUSTEXT(cPath)

希望对你有帮助



[此贴子已经被作者于2022-1-30 08:36编辑过]

#36
fanjinyu91082022-01-31 08:59
好的,非常感谢,有些问题还是没有完全弄懂,慢慢消化,不懂的再问,先结贴
1