L
lovezyp
Unregistered / Unconfirmed
GUEST, unregistred user!
uses ShellAPI;<br>procedure TForm1.Createimages;<br>var<br> SysImageList : uint;<br> SFI : TSHFileInfo;<br>begin<br> SysImageList := SHGetFileInfo('', 0, SFI, SizeOf(TSHFileInfo),<br> SHGFI_SYSICONINDEX or SHGFI_SMALLICON);<br> if SysImageList <> 0 then<br> begin<br> ImageList1.Handle := SysImageList;<br> ImageList1.ShareImages := TRUE;<br> end;<br>end;<br>function IsValidDir(SearchRec:TSearchRec):integer;<br>begin<br>if (SearchRec.Attr <> 16) and (SearchRec.Name<>'.') and (SearchRec.Name<>'..') then<br>Result:=0<br>else<br>if (SearchRec.Attr = 16) and (SearchRec.Name<>'.') and (SearchRec.Name<>'..') then<br>Result:=1<br>else<br>Result:=2;<br>end;<br><br> function TForm1.AddFile(FDirectory: string; FileMask: string; Attr: DWord):<br> Boolean;<br>var<br> ShInfo: TSHFileInfo;<br> attributes: string;<br> FDate, FName, FileName: string;<br> FSize, FDirectorySize,i,ret,find,h: Integer;<br> FI: TSearchRec;<br> CurPath: string;<br> subdir:tstrings;<br>begin<br> Result := False;<br> find:=0;<br> if not SetCurrentDir(FDirectory) then<br> exit;<br> statusbar1.Panels[0].Text:=' 正在添加文件,请稍后...';<br> if FindFirst(FileMask, faAnyFile, FI) = 0 then<br> try<br> repeat<br> if ((Attr and FILE_ATTRIBUTE_DIRECTORY) = (FI.Attr and<br> FILE_ATTRIBUTE_DIRECTORY))<br> then<br> begin<br> CurPath := IncludeTrailingBackslash(FDirectory);<br> FName := FI.Name;<br> FileName := IncludeTrailingBackslash(FDirectory) + FName;<br> if filename=Application.ExeName then Exit;//不允许添加自己<br> for ret:=0 to ListView1.Items.Count-1 do //这是我写的避免重复添加的代码,不知哪里有问题<br> if (listview1.Items.Item[ret].SubItems[2]=filename) then<br> inc(find);//查到重复文件后,find<>0<br> if find<>0 then exit;//有重复文件就退出不添加<br> if (FName = '.') or (FName = '..') then<br> continue;<br> SHGetFileInfo(PChar(FileName), 0, ShInfo, SizeOf(ShInfo),<br> SHGFI_TYPENAME or SHGFI_SYSICONINDEX or SHGFI_DISPLAYNAME);<br> FSize := FI.Size div 1024;<br> if (fsize<1)and(fi.size<>0) then fsize:=1;<br> i:=pos('.',fname);<br> delete(fname,i,9);<br> with ListView1.Items.Add do //查找部分有问题<br> begin<br> Caption := FName;<br> if ListView1.SmallImages <> nil then<br> ImageIndex := ShInfo.iIcon;<br> if (FI.Attr and FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY<br> then<br> SubItems.Add(' ')<br> else<br> h:=pos('~',fi.Name);<br> if h<>0 then SubItems.Add('备份文件') else//这个由于不能分辨备份文件。如123.~exe所以我加了判断<br> SubItems.Add(ShInfo.szTypeName);<br> SubItems.Add(Trim(IntToStr(FSize))+'KB');<br> SubItems.Add(filename);<br> end;<br> FDirectorySize := FDirectorySize + FSize;<br> Result := True;<br> end;<br> until FindNext(FI) <> 0;<br> finally<br> FindClose(FI);<br> end;<br> Subdir:=TStringList.Create;//递归查找子目录<br> if FindFirst(FileMask, faAnyFile, FI) = 0 then<br> begin<br> repeat<br> if IsValidDir(fi)=1 then Subdir.Add(curpath+fi.Name);<br> application.ProcessMessages ;<br> until (FindNext(fi) <> 0);<br>end;<br>FindClose(fi);<br>for i:=0 to Subdir.Count-1 do<br>AddFile(subdir.Strings,'*.*',SHGFI_SYSICONINDEX or SHGFI_SMALLICON);<br>Subdir.Free;<br>end;<br><br>//-------------------------------------------------------------------------<br>我的这一段代码需要实现的功能是向listview里添加一个文件,如果是目录,还可以查找目录里的所有文件,包括子目录的文件,不允许添加自己,排除重复的文件!可以显示文件的图标!<br><br>这个listview添加文件后显示如下效果:如<br><br>文件名 文件类型 文件大小 路径<br>123 应用程序 234KB c:/wer/123.exe<br>jin 声音文件 23KB d:/音乐/jin.wma<br> <br>由于这段代码是别人写的,我只是做了修改,但经过测试,发现以下问题:<br>1添加文件:正常<br>2添加一个目录,如果这个目录有文件:正常<br>3添加一个目录,如果这个目录没有文件,但有一个子目录,子目录里有文件:不正常<br> 如C:/123/1234/这个目录,123下面没有任何文件,1234下面有文件we.exe,我添加文件的目录如果是C:/123/1234/没问题,如果是C:/123/<br> 则显示如下:(路径显示不对,文件图标不对):<br> 文件名 文件类型 文件大小 路径<br> we 应用程序 234KB 1234/we.exe<br>4 一个目录,如c:/123下面几个文件,我们设有1.exe,2.exe,3.exe这三个文件,我先添加一个文件2.exe,很正常,但我再添加这个目录,因为代码里有我写的避免重复添加的功能,应该是只添加1和3,但实际是只添加了1,没有3,不知我写的错在那里,查到重复后就退出,不向下添加了!<br>请帮帮忙,帮我把代码修改优化一下,这里面可能有些代码不需要,请帮我删除!我是初学者,有的地方不是很懂,谢谢!!6点以前在线等!