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