diff --git a/CHANGELOG.md b/CHANGELOG.md
index b17ec72..b760c15 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,7 @@
 * Add CHANGELOG.md
 * Add SmartPicker
 * Take care that photos to retrieve count is not greater than total photos count (at AbstractPicker level)
+* On FilesystemUploader, check that target directory exists and is empty before scanning
 
 # 0.3.1
 * Allow to use a custom target directory in Dropbox
diff --git a/photospicker/uploader/filesystem_uploader.py b/photospicker/uploader/filesystem_uploader.py
index 05af0f9..a2277ae 100644
--- a/photospicker/uploader/filesystem_uploader.py
+++ b/photospicker/uploader/filesystem_uploader.py
@@ -6,7 +6,14 @@ import os
 class FilesystemUploader(AbstractUploader):
     """Copy picked photo to a filesystem empty directory"""
 
-    def initialize(self):  # pragma: no cover
+    def __init__(self, folder_path):
+        """
+        Constructor
+
+        :param str folder_path: target folder path
+        """
+        super(FilesystemUploader, self).__init__(folder_path)
+
         """Check target directory"""
         if not os.path.isdir(self._path):
             raise UploaderException(
@@ -20,6 +27,9 @@ class FilesystemUploader(AbstractUploader):
                 "Directory {path} not empty".format(path=self._path)
             )
 
+    def initialize(self):
+        pass
+
     def upload(self, binary, original_filename):
         """
         Upload or copy files to destination

FilesystemUploader: check that directory exists and is empty in the constructor
For raising the error before the files scan
diff --git a/tests/uploader/test_filesystem_uploader.py b/tests/uploader/test_filesystem_uploader.py
index 9e7045c..ae278db 100644
--- a/tests/uploader/test_filesystem_uploader.py
+++ b/tests/uploader/test_filesystem_uploader.py
@@ -10,7 +10,7 @@ class TestFilesystemUploader(TestCase):
 
     @mock.patch('os.listdir')
     @mock.patch('os.path.isdir')
-    def test_initialize_directory_not_found(self, is_dir_mock, listdir_mock):
+    def test_constructor_directory_not_found(self, is_dir_mock, listdir_mock):
         """
         Test that an exception is launched if the directory is not found
 
@@ -20,8 +20,7 @@ class TestFilesystemUploader(TestCase):
         is_dir_mock.return_value = False
 
         with self.assertRaises(UploaderException) as cm:
-            sut = FilesystemUploader('/root/myfolder')
-            sut.initialize()
+            FilesystemUploader('/root/myfolder')
 
         is_dir_mock.assert_called_with('/root/myfolder')
 
@@ -29,7 +28,7 @@ class TestFilesystemUploader(TestCase):
 
     @mock.patch('os.listdir')
     @mock.patch('os.path.isdir')
-    def test_initialize_directory_not_empty(self, is_dir_mock, listdir_mock):
+    def test_constructor_directory_not_empty(self, is_dir_mock, listdir_mock):
         """
         Test that an exception is launched if the directory is not empty
 
@@ -40,8 +39,7 @@ class TestFilesystemUploader(TestCase):
         listdir_mock.return_value = ['myfile']
 
         with self.assertRaises(UploaderException) as cm:
-            sut = FilesystemUploader('/root/myfolder')
-            sut.initialize()
+            FilesystemUploader('/root/myfolder')
 
         is_dir_mock.assert_called_with('/root/myfolder')
         listdir_mock.assert_called_with('/root/myfolder')

pip install -e .
parse_log_pytest
requirements.txt
pytest
3.9
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
cachetools==5.5.2
callee==0.3.1
certifi==2025.1.31
chardet==5.2.0
charset-normalizer==3.4.1
codecov==2.1.13
colorama==0.4.6
coverage==7.8.0
distlib==0.3.9
dropbox==12.0.2
exceptiongroup==1.2.2
filelock==3.18.0
flake8==7.2.0
google-api-core==2.24.2
google-api-python-client==2.166.0
google-auth==2.38.0
google-auth-httplib2==0.2.0
googleapis-common-protos==1.69.2
httplib2==0.22.0
idna==3.10
iniconfig==2.1.0
mccabe==0.7.0
mock==5.2.0
oauth2client==4.1.3
packaging==24.2
-e git+https://github.com/l-vo/photos-picker.git@3ed989be337cfcfd97d926cdfad8573fe5db8f14#egg=photos_picker
pillow==11.1.0
platformdirs==4.3.7
pluggy==1.5.0
ply==3.11
proto-plus==1.26.1
protobuf==6.30.2
pyasn1==0.6.1
pyasn1_modules==0.4.2
pycodestyle==2.13.0
PyDrive==1.3.1
pyflakes==3.3.1
pyparsing==3.2.3
pyproject-api==1.9.0
pytest==8.3.5
PyYAML==6.0.2
requests==2.32.3
rsa==4.9
six==1.17.0
stone==3.3.1
tomli==2.2.1
tox==4.25.0
typing_extensions==4.13.0
unittest-dataprovider==1.0.3
uritemplate==4.1.1
urllib3==2.3.0
virtualenv==20.29.3
zope.event==5.0

name: photos-picker
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - pip=25.0=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - cachetools==5.5.2
      - callee==0.3.1
      - certifi==2025.1.31
      - chardet==5.2.0
      - charset-normalizer==3.4.1
      - codecov==2.1.13
      - colorama==0.4.6
      - coverage==7.8.0
      - distlib==0.3.9
      - dropbox==12.0.2
      - exceptiongroup==1.2.2
      - filelock==3.18.0
      - flake8==7.2.0
      - google-api-core==2.24.2
      - google-api-python-client==2.166.0
      - google-auth==2.38.0
      - google-auth-httplib2==0.2.0
      - googleapis-common-protos==1.69.2
      - httplib2==0.22.0
      - idna==3.10
      - iniconfig==2.1.0
      - mccabe==0.7.0
      - mock==5.2.0
      - oauth2client==4.1.3
      - packaging==24.2
      - pillow==11.1.0
      - platformdirs==4.3.7
      - pluggy==1.5.0
      - ply==3.11
      - proto-plus==1.26.1
      - protobuf==6.30.2
      - pyasn1==0.6.1
      - pyasn1-modules==0.4.2
      - pycodestyle==2.13.0
      - pydrive==1.3.1
      - pyflakes==3.3.1
      - pyparsing==3.2.3
      - pyproject-api==1.9.0
      - pytest==8.3.5
      - pyyaml==6.0.2
      - requests==2.32.3
      - rsa==4.9
      - six==1.17.0
      - stone==3.3.1
      - tomli==2.2.1
      - tox==4.25.0
      - typing-extensions==4.13.0
      - unittest-dataprovider==1.0.3
      - uritemplate==4.1.1
      - urllib3==2.3.0
      - virtualenv==20.29.3
      - zope-event==5.0
prefix: /opt/conda/envs/photos-picker

tests/uploader/test_filesystem_uploader.py::TestFilesystemUploader::test_constructor_directory_not_empty tests/uploader/test_filesystem_uploader.py::TestFilesystemUploader::test_constructor_directory_not_found
tests/uploader/test_filesystem_uploader.py::TestFilesystemUploader::test_upload
photospicker/uploader/filesystem_uploader.py CHANGELOG.md
photospicker/uploader/filesystem_uploader.py CHANGELOG.md