文件保存问题(50分)

  • 主题发起人 主题发起人 xjlaokai2000
  • 开始时间 开始时间
X

xjlaokai2000

Unregistered / Unconfirmed
GUEST, unregistred user!
当我在程序中保存一个excel 文件时,把用户在edit中输入的文件路径及文件名赋
给新的excel文件。
xlsFileName:=edit1.text;
WorkBook.Saveas(xlsFileName);

当输入一个已有路径时,程序运行正常,但如果用户在edit中输入的保存路径不存在时,
如:c:/jfksla/hdfj/hjdkf/jhdfk.xls等。程序运行无法进行,出现一个警告,意思是
指定的文档名称或路径不存在。

那么如何保存这样的文件?
;
 
用SaveDialog控件,讓使用者選擇保存的路徑用輸入文件名.
 
使用 SaveDialog得到保存的文件名, SaveDialog.Options.ofPathMustExist 设置为true
这样得到的文件名可以保证有效
 
要不然,你自己先创建好目录
 
没有别的办法了吗?
 
用try先建好目录。
 
可以加入一些异常处理程序,不存在的目录用API创建。看看delphi自带的Reference。
 
请帮我看看,我想程序中创建文件夹,为什么总是提示:'Cannot create xlsfilename'?哪里有问题?
unit Unit1;

interface

uses
; Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
; StdCtrls,FileCtrl;

type
; TForm1 = class(TForm)
; ; Edit1: TEdit;
; ; Button1: TButton;
; ; Label1: TLabel;
; ; Label2: TLabel;
; ; procedure Button1Click(Sender: TObject);
; private
; ; { Private declarations }
; public
; ; { Public declarations }
; end;

var
; Form1: TForm1;
; xlsfilename:string;
implementation

{$R *.DFM}


procedure TForm1.Button1Click(Sender: TObject);
begin
edit1.text:='d:/mydocument/dfjladf/djfkd/top.txt';

xlsfilename:=edit1.text;
label1.caption:=ExtractFilePath(xlsfilename);
label2.Caption:=ExtractFileDir(xlsfilename);

;if not DirectoryExists(ExtractFileDir(xlsfilename)) then
; ; if not CreateDir(ExtractFileDir(xlsfilename)) then
; ; raise Exception.Create('Cannot create xlsfilename');

end;

end.
 
你想创建d:/mydocument/dfjladf/djfkd,那么d:/mydocument/dfjladf也必须存在
你想创建d:/mydocument/dfjladf,那么d:/mydocument也必须存在
 
你自已先检查目录存不存在嘛。
 
创建目录时一级一级的创建,否则CreateDir返回False;用SaveDialog控件吧。如不嫌麻烦
也可以做一个循环创建Edit1.txt指定的目录。
 
我正是不想用SaveDialog控件,所以才要自己创建目录,
感谢大家指出创建目录时一级一级的建,小弟想像kingdeezj
说的做一个循环创建Edit1.txt指定的目录,但我在字符串操作函数
中只找到了strsacn ,strrscan ,strpos,这几个我认为有用的函数,
我的设想是:对于像d:/mydocument/dfjladf/djfkd这样的字符串,
先用strscan找到第一个'/',将第一个'/'前字符删去,再用strscan第二个'/',
将第一次找到的内容与第二次内容相加,建立第一个目录,如此直到strrcscan。
但我又不会写这段程序,

不知还有没有更好的方法,有哪位大哥愿帮忙的吗?写代码者重谢!
看来基本功还是很重要的!!!
 
ForceDirectories 代替createDir。
 
ydfq说的很对,十分感谢,马上就给各位加分。但还有一个问题,烦劳各位
大哥指点一下:如何判断用户在edit中输入的路径和文件名有效,如:输入
“c:/jfksla/hdfj/hjdkf:/jhdfk*.xls”,如何判断文件名中是否为空的(
用户没有输入),或文件名中含有/ / ;: ;* ;? ;< > |等,我考虑用
strscan函数判断,逐个判断再“与and”到一起,不知还有没有更好的方
法?那么如何判断用户输入的字符串是否为空呢?这一点我也不知道,
请教各位!!!
 
打开文件使用的函数不正确哦,
使用Rewrite()打开文件就好好了嘛。
 
我是想让用户输入文件名,在Excel中保存。
help me !
 
首先 Edit1.Text:=Trim(Edit1.Text)
然后判断 if Edit1.Text='' then 看是否为空
 
然后 ExtractFileDir 看是否为空,空说明当前目录,不管
不空的话判断是否目录存在,不存在则创建
最后尝试创建这个文件看能否成功(文件名非法字符有很多,自己判断比较难)
不成功就说明文件名非法,成功的话用deletefile删除之
 
下面是创建子目录的代码:
procedure createdir(Dstr:string);
var
TempStr,DrvStr,DirStr,DoStr:string;
i,drvType:integer;
Sub:boolean;
begin
sub:=true;
Drvstr:=copy(dstr,1,pos(':',dstr)+1);
drvtype:=GetDriveType(pchar(drvstr)); ; ; ; ; ; ;//取出驱动器字符。
Delete(dstr,1,pos(':',dstr)+1);
if (drvtype=2) or (drvtype=3) then begin //是否硬盘或软盘
; while (length(dstr)<>0)and(pos('/',Dstr)>0) do
; begin
; ; sub:=false;
; ; Tempstr:=copy(Dstr,1,pos('/',Dstr));
; ; Delete(Dstr,1,pos('/',Dstr));
; ; Dirstr:=Dirstr+TempStr;
; ; i:=length(DrvStr+Dirstr);
; ; Dostr:=copy(DrvStr+Dirstr,1,i);
; try
; ; if not DirectoryExists(DoStr) then begin
; ; ;MKDIR(Dostr); ; ;//循环建立子目录
; ; ;end;//endif
; except
; ShowMessage('创建路径失败');
; end;//endtry
; end;//endwhile
if sub then begin
; ; if not DirectoryExists(drvstr+dstr) then
; ; mkdir(drvstr+dstr);
; end else
; ; mkdir(Dostr+'/'+dstr);//建立最后一级目录
END else//ENDIF
SHOWMESSAGE('不能定向到指定路径');
end;

没想到你有连文件名一起输入的情况,只考虑了目录创建了,不过,你可以先把Edit1.Text
先ExtractDir()取得目录,再赋值给本过程。要检查用户是否输入合法也很好办,只准用户输入
字母,数字和几个有效的特殊字符,可以在Edit1.OnKeyPress/Down中判断。
 
呵呵,我怎么不知道有ForceDirectories(),唉,白费了半天工夫,Microsoft的东东还真多。。。
[:)][:D][8D][:(][:(!][^][?][:D][?][^][:(!][:(][8D][:D][:)][:D][8D][:D][:D]
 
后退
顶部