注册 登录
编程论坛 VFP论坛

关于vfp中copy to 后文件名中字母不是大写而是小写问题

chychychy 发布于 2025-12-02 16:58, 299 次点击
这个问题似乎有点钻牛角的味道,请论坛内大佬指教,用vfp的语句方式能否解决?(查询了论坛内以前帖子和问dp都没有解决)
因工作关系需要导出文件夹(用大写字母,比如下面语句)和文件名(用考生身份证号),但用copy to导出的文件名中字母都自动为小写,尤其以考生身份证号命名的文件中有x就即为不方便
以前帖子

帖子1:如何将文件名中的小写字母重命名为大写字母
https://bbs.bc-cn.net/thread-507797-1-1.html

帖子2:如何解决VFP中用copy to 命令复制图片时文件名由小写字母转为大写字母
https://bbs.bc-cn.net/viewthread.php?tid=427181&highlight=copy%2Bto

帖子3:copy file后文件名大小写问题

https://bbs.bc-cn.net/viewthread.php?tid=513962&highlight=%B4%F3%D0%A1%D0%B4

帖子4:请教:修复复制文件文件名会变成小写字母的问题;这个帖子里有方法,一是BUG并给了个链接(帖子1页给链接了),但链接个人有点愚笨不会用,二是下面方式,不同路径可以,同一路径就不行了。
pp="D:\AAA.txt"
DECLARE long CopyFile IN "kernel32" String,String,long
IF CopyFile("C:\aaa.txt",pp,0)=1
   ?'ok'
ENDIF
https://bbs.bc-cn.net/thread-512686-1-1.html

测试导出文件夹语句,里面的A导出后都是a了
sj = TTOC(DATETIME(), 1)
ml='\编排数据'+sj
wjm11=ml+'\拟彩印A01'
COPY TO (wjm11) FIELD 准考证号,考生姓名,科目 TYPE XL5 FOR BZ1='1'
16 回复
#2
csyx2025-12-02 19:09
copy to 之后,用 MoveFile 重命名一次即可

用 myfll 的话
copy to (wjm11) ...
MoveFiles(wjm11, wjm11)

否则
copy to (wjm11) ...
Declare Long MoveFile in win32api String, String
MoveFile(wjm11, wjm11)

#3
chychychy2025-12-02 20:46
回复 2楼 csyx
谢谢,为何我测试还是小写
程序代码:

&&&获取桌面路径方法一

DECLARE LONG SHGetSpecialFolderPath IN Shell32 LONG, STRING@, LONG, LONG
cPath = SPACE(260)
SHGetSpecialFolderPath(0, @cPath, 0x10, 0)
cPath = LEFT(cPath, AT(0h00,cPath)-1)

sj = TTOC(DATETIME(), 1)
ml=cPath+'\编排数据'+sj
wjm=ml+'\完成总'+sj
wjm1=ml+'\A01'
wjm2=ml+'\A02'
wjm3=ml+'\A03'
wjm4=ml+'\A04'

wjm11=ml+'\拟彩印A01'
wjm21=ml+'\拟彩印A02'
wjm31=ml+'\拟彩印A03'
wjm41=ml+'\拟彩印A04'

MD &ml

? ml
COPY TO (wjm11) FIELD 准考证号,考生姓名,科目 TYPE XL5 FOR BZ1='1'
Declare Long MoveFile in win32api String, String
MoveFile(wjm11, wjm11)
#4
foxfans2025-12-02 20:52
cSrc="C:\AAA.png"
cDest="C:\BBB.PNG"
DECLARE long CopyFile IN "kernel32" String@,String@,long
IF CopyFile(@cSrc,@cDest,1)=1
   ?'ok'
ENDIF
'如果是小写,可能没刷新
#5
chychychy2025-12-02 21:05
回复 4楼 foxfans
谢谢,不同文件名测试确实可以,相同文件名测试了不行呢
#6
foxfans2025-12-02 21:10
相同文件名你复制在同一个文件夹当然不行了,可以给一个临时文件过渡,假如在同一文件夹同名情况
DECLARE INTEGER CopyFile IN kernel32.dll STRING lpExistingFile, STRING lpNewFile, INTEGER bFailIfExists
DECLARE INTEGER DeleteFile IN kernel32.dll STRING lpFileName
cSrc="c:\测试.png"
cTmp="c:\测试.PNG.tmp"
cDest="c:\测试.PNG"
IF CopyFile(cSrc, cTmp, 0) <> 0
   DeleteFile(cSrc)
   IF CopyFile(cTmp,cDest,0)<>0
      *ok
      DeleteFile(cTmp)
   ENDIF
ENDIF




[此贴子已经被作者于2025-12-2 21:44编辑过]

#7
chychychy2025-12-02 21:49
回复 6楼 foxfans
高手!谢谢。受你启发,可以借助中间临时文件,或者旧文件小写,新文件大写也可以。下面代码测试正确

程序代码:

&&&获取桌面路径方法一

DECLARE LONG SHGetSpecialFolderPath IN Shell32 LONG, STRING@, LONG, LONG
cPath = SPACE(260)
SHGetSpecialFolderPath(0, @cPath, 0x10, 0)
cPath = LEFT(cPath, AT(0h00,cPath)-1)
&&? cPath

sj = TTOC(DATETIME(), 1)
ml=cPath+'\编排数据'+sj

MD &ml

wjm=ml+'\完成总'+sj
wjm1=ml+'\A01'
wjm2=ml+'\A02'
wjm3=ml+'\A03'
wjm4=ml+'\A04'

SORT ON px,组别,序号 TO &wjm  

DECLARE LONG MoveFile IN win32api STRING, STRING

* 处理 A01
wjm11 = ml + '\拟彩印A01'
wjm11_lower = ml + '\拟彩印a01'  && 使用小写文件名

COPY TO (wjm11_lower) FIELD 准考证号, 考生姓名, 科目 TYPE XL5 FOR BZ1='1'

tempFile = ml + '\_tempA01'
MoveFile(wjm11_lower + ".xls", tempFile + ".xls")
MoveFile(tempFile + ".xls", wjm11 + ".xls")

* 处理 A02
wjm21 = ml + '\拟彩印A02'
wjm21_lower = ml + '\拟彩印a02'

COPY TO (wjm21_lower) FIELD 准考证号, 考生姓名, 科目 TYPE XL5 FOR BZ1='2'

*tempFile = ml + '\_tempA02'
*MoveFile(wjm21_lower + ".xls", tempFile + ".xls")
*MoveFile(tempFile + ".xls", wjm21 + ".xls")
MoveFile(wjm21_lower + ".xls", wjm21 + ".xls")
#8
吹水佬2025-12-03 00:02
用 CREATE 或 FCREATE 应该也可以
如:
CREATE TABLE TmpTable (a i, b i)
SELECT * FROM TmpTable INTO TABLE MyTable
将数据再 append 进去就可以
#9
schtg2025-12-03 06:33
学习啦,谢谢各位分享!
#10
hsfisher2025-12-03 08:37
学习啦
#11
chychychy2025-12-03 10:47
回复 8楼 吹水佬
吹版,不好意思,我没试过,您的这个对Excel的有效吗
#12
chychychy2025-12-03 10:50
回复 2楼 csyx
命令是没有错的,为何没实现效果,我想大概是这样,同一目录下,Windows大小写其实是一样的,等于没改,所以可以借助中间文件,或者第一次是小写,第二次是大写,这样的方式来改一下才可以。后面的测试基本证明了。
#13
吹水佬2025-12-03 11:11
以下是引用chychychy在2025-12-3 10:47:28的发言:

吹版,不好意思,我没试过,您的这个对Excel的有效吗

不是说vfp创建文件名大小写的问题吗?这与 excel 有什么关系?
#14
chychychy2025-12-03 13:42
回复 13楼 吹水佬
不好意思,是我表达的不清楚了。在我使用中,如下情况:
wjm1=ml+'\A01'
wjm11 = ml + '\拟彩印A01'
SORT ON px,组别,序号 TO &wjm  &&&这句导出是dbf文件的,名称中大写字母A正常显示,
COPY TO (wjm11_lower) FIELD 准考证号, 考生姓名, 科目,考试日期 TYPE XL5 FOR BZ1='1' &&&这句导出是Excel文件的,名称中大写字母A ,会变成小写的a

您的这两句,我看着像是创建的dbf文件,我意思是导出为Excel文件怎么参考使用并且保证大写正常显示
CREATE TABLE TmpTable (a i, b i)
SELECT * FROM TmpTable INTO TABLE MyTable
将数据再 append 进去就可以
#15
吹水佬2025-12-03 14:14
回复 14楼 chychychy
建议非必要不用 copy to .....excel文件,输出能力很有限,处理的数据记录也有限制。
可以用excel对象生成不同格式的excel表格文件。
#16
chychychy2025-12-03 17:20
回复 15楼 吹水佬
哦,谢谢指教,初学者水平有限,请勿见笑,平时没用过,能示例指教一下。
#17
吹水佬2025-12-03 17:56
以下是引用chychychy在2025-12-3 17:20:53的发言:

哦,谢谢指教,初学者水平有限,请勿见笑,平时没用过,能示例指教一下。

论坛搜索“EXCEL”
1