PDA

View Full Version : چک کردن وجود یک فایل در server



setare7sky
چهارشنبه 28 آذر 1386, 09:04 صبح
با سلام.
من می خوام بدونم که آیا فایلی مثلا با نام A.txt در یک مسیر مثلا c:\temp وجود داره یا نه؟
آیا با استفاده از Sql می تونم این رو بفهمم؟

reza_rad
چهارشنبه 28 آذر 1386, 09:13 صبح
بله می تونید
البته به شرطی که SQLServer موجود به شما امکان استفاده از xp_cmdshell رو بده. معمولا جلوی استفاده از این sp گرفته می شه به دلایل امنیتی .
این sp به شما امکان اجرای کامندهای ویندوز رو از توی SQLServer میده.

توضیحات بیشتر در مورد xp_cmdshell :
http://msdn2.microsoft.com/en-us/library/aa260689(SQL.80).aspx

setare7sky
چهارشنبه 28 آذر 1386, 09:20 صبح
من اجازه استفاده از xp_cmdshell رو دارم . ولی نمی دونم برای چک کردن باید از چه دستوری استفاده کنم و بعد در صورت وجود فایل در مسیر مورد نظر چطور نتیجه رو از طریق برنامه دلفی ببینم؟
می دونم که میشه نتیجه رو داخل یه جدول بریزم ولی نمی دونم چطور باید بفهمم که فایل در مسیر هست یا نه؟

reza_rad
چهارشنبه 28 آذر 1386, 09:26 صبح
من اجازه استفاده از xp_cmdshell رو دارم . ولی نمی دونم برای چک کردن باید از چه دستوری استفاده کنم و بعد در صورت وجود فایل در مسیر مورد نظر چطور نتیجه رو از طریق برنامه دلفی ببینم؟
اگه میخواهید از توی برنامه تون ببینید که آیا فایل وجود داره و به اون مسیر برید دیگه چرا از طریق SQLServer می خواهید اینکارو بکنید؟ مسلما دلفی توابعی برای اینکه چک کنه آیا فایل موردنظروجودداره یا نه در اختیار شمامیذاره.

setare7sky
چهارشنبه 28 آذر 1386, 12:14 عصر
مشکل اینجاست که من یه برنامه Backup نوشتم که می خوام از اطلاعات کامپیوترهای کلاینت روی سرور پشتیبان گیری کنه . یعنی برنامه روی کلاینت اجرا میشه و از طریق xp_cmdShell اطلاعات کلاینت روی یه مسیر از سرور کپی می شه . می دونید که اگه از این دستور استفاده نکنیم نمی تونیم از روی کلاینت روی سرور بنویسیم .
حالا بعد از کپی شدن اطلاعات می خوام چک کنم که آیا اطلاعات روی سرور کپی شده یا نه؟ در صورتیکه از آدرسی مثل c:\temp\a.txt استفاده کنم ، روی کلاینت مسیر بررسی می شه ولی من می خوام آدرس روی سرور بررسی بشه ، به خاطر همین از sql استفاده می کنم.

reza_rad
چهارشنبه 28 آذر 1386, 12:41 عصر
راه های زیادی برای اینکاروجود داره.
استفادهاز job ها و SSIS ها و....
ضمن اینکه شما می تونید دایرکتوری ای در سرور که فایل ها در اون ذخیره می شن رو share کنید و به یک یوزر بهش دسترسی بدید و اول برنامه تون یک map drive بسازید و از روی کلاینت هم می تونید به اینصورت وجود فایل روچک کنید.

اما برای روش شما می شه از این نمونه استفاده کرد:


-- using the scripting object
declare @Path varchar(128) ,
@FileName varchar(128)
select @Path = 'C:\' ,
@FileName = 'myfile.txt'

declare @objFSys int
declare @i int
declare @File varchar(1000)

select @File = @Path + @FileName
exec sp_OACreate 'Scripting.FileSystemObject', @objFSys out
exec sp_OAMethod @objFSys, 'FileExists', @i out, @File
if @i = 1
print 'exists'
else
print 'not exists'
exec sp_OADestroy @objFSys

-- using xp_cmdshell
declare @Path varchar(128) ,
@FileName varchar(128)
select @Path = 'C:\' ,
@FileName = 'myfile.txt'

declare @cmd varchar(1000)
create table #a(s varchar(1000))

select @cmd = 'dir /B ' + @Path + @FileName
insert #a exec master..xp_cmdshell @cmd

if exists (select * from #a where s = @FileName)
print 'exists'
else
print 'not exists'
drop table #a

-- using xp_fileexists
declare @Path varchar(128) ,
@FileName varchar(128)
select @Path = 'C:\' ,
@FileName = 'myfile.txt'

declare @i int
declare @File varchar(1000)

select @File = @Path + @FileName
exec master..xp_fileexist @File, @i out
if @i = 1
print 'exists'
else
print 'not exists'



منبع:
http://www.nigelrivett.net/SQLTsql/CheckIfFileExists.html