ENES TAŞ

Senior Software Developer

MS SQL'de Dosya Ve Klasör Kontrolü (xp_fileexist ve sys.dm_os_file_exists) 29.10.2018

SQL ile bir dosyanın var olup olmadığını kontrol etmeniz gerekebilir.

SQL SERVER 2017 öncesi bu işlem için xp_fileexist komutu kullanılıyordu, SQL SERVER 2017 ile birlikte bu komut yerini sys.dm_os_file_exist komutuna bıraktı. 

Eğer SQL SERVER 2017 öncesi bir sürüm kullanıyorsanız xp_fileexist komutuyla bir dosyanın varlığını nasıl sorgulayabiliriz öncelikle ona bakalım. 

Örnek Sorgu:

EXEC xp_fileexist 'C:/abc.txt'


C dizininde abc.txt isimli bir dosyanın olup olmadığını sorguladık, sorgunun sonucu aşağıdaki gibi dönecektir. 


C dizininde abc.txt isimli bir dosya olmadığı için [File Exists] alanı 0 olarak döndü. Eğer dosyamız belirttiğimiz konumda varsa bu sonuç 1 olarak dönecektir. 

Aynı komut ile klasör sorgulaması da yapabiliriz.

Örneğin;

EXEC xp_fileexist 'C:/Windows'


Bu sorgumuzun sonucu da aşağıdaki şekilde döndü.

Burada klasör sorgulaması yaptığımız için [File is a Directory] alanı 1 olarak döndü, [Parent Directory Exists] alanı ise klasörün üst dizininin olup olmadığı bilgisini dönmektedir. 

Kısaca özetlersek dosya sorgularında [File Exists], klasör sorgularında [File is a Directory] alanlarındaki sonucu baz alabilirsiniz.


SQL SERVER 2017 ile ise bu işlemi aşağıdaki şekilde örneklendirebiliriz. 

select * from sys.dm_os_file_exists('C:/abc.txt')



Şimdi iki sorgunun kullanımına daha kapsamlı örneklerle bakalım. Örneğin UrunResimleri isimli bir tablomuz olsun. Bu tabloda ürünlerimize ait resimlerin yollarını saklayalım. Ürüne ait resimlerin fiziksel varlığını sorgulayalım ve sadece resim olan kayıtları dönelim. 

Tablomuzdaki alanların basitçe UrunResimID,UrunID,UrunResimYolu şeklinde olduğunu varsayalım. 

SQL SERVER 2017'de bu işlemi aşağıdaki sorgu ile yapabilirsiniz. 

Select UrunResimleri.* from UrunResimleri 
cross apply sys.dm_os_file_exists(UrunResimleri.UrunResimYolu)
Where sys.dm_os_file_exists.file_exists=1

/* daha sadeleştirilmiş hali */
Select r.* from UrunResimleri r
cross apply sys.dm_os_file_exists(r.UrunResimYolu) f 
Where f.file_exists=1


SQL SERVER 2017 öncesi versiyonlarda bu işlem için aslında ek olarak yardımcı bir fonksiyona ihtiyacımız olacak. Aşağıdaki sorgu ile yardımcı fonksiyonumuzu oluşturabiliriz. 

CREATE FUNCTION [dbo].[DosyaVarmi](@DosyaYolu NVARCHAR(4000))
RETURNS INT 
AS 
BEGIN
	DECLARE @FileExist INT
	EXEC xp_fileexist @DosyaYolu, @FileExist OUT
	
	RETURN @FileExist
END


Ürün Resimleri kontrolü için örnek sorgumuz ise şu şekilde;

Select * from UrunResimleri where dbo.DosyaVarmi(UrunResimYolu)=1


Kolay gelsin. 


Yorum Yap