主题:  一个删除上传文件的问题

haj

职务:普通成员
等级:1
金币:0.0
发贴:40
注册:2002/2/13 14:35:11
#12002/12/1 19:30:36
<%@LANGUAGE="vbscript" CODEPAGE="936"%>

<%
Response.Buffer=1
Dim strID,rsDel,File,sql
strID=Request("checkdel")
if strID = "" then
Response.write "你什么都没选"
else
Set File = CreateObject("Scripting.FileSystemObject")
Set rsDel= Server.CreateObject("ADODB.Recordset")
rsDel.ActiveConnection = MM_pnew_STRING
sql="SELECT * FROM ptb WHERE Psy IN "
sql=sql &"(" & strID & ")"
rsDel.Source = sql
rsDel.LockType = 3
rsDel.open()
%>
<%
Do While rsDel.EOF=False
dim TempPath
TempPath=(Server.Mappath(("upimg") &"/" & rsDel("Pname")))    位置①
rsDel.Delete
if File.FileExists(TempPath)=true then
File.DeleteFile(TempPath)
rsDel.MoveNext
Else
位置A
End if
Exit Do
Loop
rsDel.Close
Set File=Nothing
Set rsDel=Nothing
end if
Response.redirect("list.asp")
%>

这个是删除多个上传文件的代码
我这里有两个问题请教:一个就是我如果我在delist.asp(待删除文件列表页)中什么也没选的话就直接执行最后一句:跳到list.asp页去了。如果我把最后一句写成:Response.Write "×××××",则重复上面的步骤,会在下页显示 “你什么都没选×××××” 
这个不知道怎么回事~~~~
第二个问题:如果管理员大人一不小心到上传文件的目录里把某个文件删除了,要是再执行删除文件命令的话,则在目录里找不到对应的文件,虽然是找不到相应的文件,但是删除指令还是还执行的,即:只删除数据库中对应的记录。就是执行上边的位置A,因为是多个文件删除,所以不知道怎么写。其实就是不知道那个在目录里找不到相应文件的记录的id怎么取。难道在上边的位置①下加picid=rsdel("id")就可以取到那个在目录里没有相应记录的图片id吗?

请高手帮忙,我都被这块搞晕死了~~~



5D荣誉斑竹

职务:普通成员
等级:2
金币:10.0
发贴:710
注册:2001/10/24 18:34:42
#22002/12/2 9:51:08
什么都没选当然会有问题了,你这里自己写的代码:
if strID = "" then
Response.write "你什么都没选"
'如果strID为空(也就是Request("checkdel")为空)就输出“你什么都没选”

关于删除多个文件,你这里就不能这么做了,首先应该取出要删除的多个文件的ID和文件路径,把他们放在一个数组中(或直接取出来做循环),然后做一个循环,在循环中先判断文件是否存在,如果存在就删除,不存在就跳过(你也可以选择报错)。在删除了所有文件后在删除数据记录(当然你也可以删除一个文件的同时删除一条记录,但是这样效率比较低),具体怎么做,自己再考虑一下吧



haj

职务:普通成员
等级:1
金币:0.0
发贴:40
注册:2002/2/13 14:35:11
#32002/12/2 14:12:23
不是不是,你理解错了
我说的是我什么都不选的话,则显示:“你什么都没选******”,它把这个和语句执行结束时候的response.write都一块显示出来了

第二个啊

TempPath=(Server.Mappath(("upimg" &"/" & rsDel("Pname"))

这不是把文件的路径选出来了吗?
其实id也出来了,我就是不知道该往哪里放
就是不知道pname和id怎么相对应~~



5D荣誉斑竹

职务:普通成员
等级:2
金币:10.0
发贴:710
注册:2001/10/24 18:34:42
#42002/12/2 14:39:53
很简单啊,在后面加个:

Response.write "你什么都没选"
Response.end



haj

职务:普通成员
等级:1
金币:0.0
发贴:40
注册:2002/2/13 14:35:11
#52002/12/2 15:38:52
hoho,第一个问题解决!现在就剩下一个问题了,胜利在望~~



5D荣誉斑竹

职务:普通成员
等级:2
金币:10.0
发贴:710
注册:2001/10/24 18:34:42
#62002/12/2 16:40:38
在删除文件的时候,判断一下是否有这个文件就好了:

if fs.FileExists(文件路径) then
'这里可以执行删除操作
end if

删除记录的话可以直接使用strID取出的ID来删除,SQL可以这样:

deletel 表名 where ID in ("&strID&")



haj

职务:普通成员
等级:1
金币:0.0
发贴:40
注册:2002/2/13 14:35:11
#72002/12/2 20:56:40
经过小田的指导,我现在有了头绪,其实不用知道哪个文件名对应的id,我上边的源代码里已经有了一个判断文件是否存在的语句了,如果存在就删除,那个else我想可不可以跳出loop循环呢?在对应目录下没有文件的记录我先不删除,留到最后一块删除。

那么在最后删除那些在对应目录下没有文件的记录时就方便多了,用strID就成!因为那些在对应目录下有文件的记录都删除了,剩下的都是那些在对应目录下没有文件的记录了,即这些记录的中的Psy字段必包括在strID里! hoho,想的明白,可是不知道怎么写,晕~~~

我想加的else后执行的语句如下:不知道对不对
.
.
.
else
set Command1 = Server.CreateObject("ADODB.Command")
Command1.ActiveConnection = MM_pnew_STRING
Command1.CommandText = "DELETE FROM ptb WHERE Psy IN (" + Replace(strID, "'", "''") + ")"
Command1.CommandType = 1
Command1.CommandTimeout = 0
Command1.Prepared = true
Command1.Execute()
Set Command1=nothing
end if
.
.
.
这一段不知道对不对,如果对的话该往哪里插,我试着这个位置但是不对,说loop缺少do,奇了怪了:

if File.FileExists(TempPath)=true then
File.DeleteFile(TempPath)
rsDel.MoveNext
Exit Do
Loop
else
set Command1 = Server.CreateObject("ADODB.Command")
Command1.ActiveConnection = MM_pnew_STRING
Command1.CommandText = "DELETE FROM ptb WHERE Psy IN (" + Replace(strID, "'", "''") + ")"
Command1.CommandType = 1
Command1.CommandTimeout = 0
Command1.Prepared = true
Command1.Execute()
Set Command1=nothing
end if
rsDel.Close



5D荣誉斑竹

职务:普通成员
等级:2
金币:10.0
发贴:710
注册:2001/10/24 18:34:42
#82002/12/3 9:03:49
能不能再次说明一下你最好想要的效果?如果我理解的没错的话,你是不是想把所有选中的文件连带数据库记录都删除?如果是这样的话,你何必要“在对应目录下没有文件的记录我先不删除,留到最后一块删除”呢?

不存在的文件就当它已经被删除好了,加那个判断是为了不出错,比如你要删除3个文件A,B,C,对应ID:1,2,3,其中B文件已经被管理员从硬盘中删除了,那么你只要删除A,C就可以了,而B用FileExists判断并跳过。最后,用deletel 表名 where ID in ("&strID&")来删除数据记录。因为strID里的值是(1,2,3),和你是否删除文件无关



haj

职务:普通成员
等级:1
金币:0.0
发贴:40
注册:2002/2/13 14:35:11
#92002/12/3 15:20:36
对,思路和你说的一样

这个现在我已经很清楚了,但是代码我不会写