Wednesday, December 3, 2025

Code to attach multiple files from a folder X++

My requirement is to attach multiple files from a folder to a specific record. This code selects only the files that are allowed by D365 Finance & Operations.

  public static void main(Args _args)

  {

      FilePath filePath = @"C:\Temp\saitesting"; //Folder path

      PurchId  purchId  = "000030";

      int attachedCount = 0;

      int skippedCount  = 0;

      PurchTable purchTable = PurchTable::find(purchId, true);

      if (!purchTable)

      {

          throw error(strFmt("PO %1 not found", purchId));

      }

      DocuType docType = DocuType::find("File");

      if (!docType)

      {

          throw error("@SYS19389");

      }

      System.String[] files = System.IO.Directory::GetFiles(filePath, "*.*");

      System.Collections.IEnumerator enumerator = files.GetEnumerator();

      while (enumerator.MoveNext())

      {

          try

          {

              Filename fileFullPath = enumerator.get_Current();

              Filename fileNameOnly = System.IO.Path::GetFileName(fileFullPath);

              str fileExtension = Docu::GetFileExtension(fileNameOnly);

              if (fileExtension && !Docu::validateExtension(fileExtension))

              {

                  skippedCount++;

                  warning(strFmt("Skipped %1 due to invalid extension", fileNameOnly));

                  continue;

              }

              System.IO.FileStream fileStream =

          new System.IO.FileStream(fileFullPath, System.IO.FileMode::Open, System.IO.FileAccess::Read);

              System.IO.MemoryStream memStream = new System.IO.MemoryStream();

              fileStream.CopyTo(memStream);

              fileStream.Close();

              memStream.Position = 0;

              ttsBegin;

              DocumentManagement::attachFileForReference(

          purchTable.TableId,

          purchTable.RecId,

          curext(),

          docType.TypeId,

          memStream,

          fileNameOnly,

          fileNameOnly,

          ''

      );

              ttsCommit;

              attachedCount++;

              info(strFmt("Attached %1 to PO %2", fileNameOnly, purchId));

          }

          catch (Exception::Error)

          {

              skippedCount++;

              warning(strFmt("Error attaching %1: %2", enumerator.get_Current(), exceptionTextFallThrough()));

          }

      }

      info(strFmt("Attachment job completed. %1 files attached, %2 files skipped.", attachedCount, skippedCount));

  }

Reference blog :

https://daxture.blogspot.com/2017/04/ax-2012-reading-files-from-directory.html