Alle Datein löschen deren Größe kleiner ist als 1 KB


DIN8

Grünschnabel
Hallo zusammen,

in der Hoffnung Hilfe zu bekommen wende ich mich nun vertrauensvoll an Euch.
Wir betreiben einen SQL Server der alle paar Minuten mehrere Verzeichnisse mit haufenweise Zip Files durchsucht.
Das erfolgt über ein Integration Services Paket in dem die Files entpackt, gelesen werden und deren Inhalt in verschiedene Tabellen fließt.

Zum Problem: Selten kommt es vor das Zip Files mit einer Größe von 0 KB in den Verzeichnissen stranden und damit die Ausführung des Paketes abbrechen. Solange bis irgendwer die = KB Dateien per Hand löscht.

Zum einlesen der Zip Files erstellt das Paket eine Liste der Dateien welche gelesen werden sollen.
Für mich kommen zwei Lösungen in Frage.
1: Die 0 KB Dateien löschen bevor die Liste der einzulesenden Dateien erstellt wird.
oder 2: Die Dateien mit 0 KB Größe nicht in die Liste mit einzubeziehen.

Zu mir, Ich bin neu in der Visual Studio Umgebung und habe kaum Kenntnisse in C# oder C.

Hier ist der Code der meiner Meinung nach die Liste erstellt.
Davor müsste der Teil kommen wo die 0 KB Dateien gelöscht werden oder ausgeschlossen werden.
Vielleicht kann mir ja jemand helfen. Vielen Dank

Code:
/*
   Microsoft SQL Server Integration Services Script Task
   Write scripts using Microsoft Visual C# 2008.
   The ScriptMain is the entry point class of the script.
*/

using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
using System.Collections;
using System.IO;

namespace ST_a621b4fe133145f88e1f425606e8b48a.csproj
{
    [System.AddIn.AddIn("ScriptMain", Version = "1.0", Publisher = "", Description = "")]
    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
    {

        #region VSTA generated code
        enum ScriptResults
        {
            Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
            Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
        };
        #endregion

        /*
		The execution engine calls this method when the task executes.
		To access the object model, use the Dts property. Connections, variables, events,
		and logging features are available as members of the Dts property as shown in the following examples.

		To reference a variable, call Dts.Variables["MyCaseSensitiveVariableName"].Value;
		To post a log entry, call Dts.Log("This is my log text", 999, null);
		To fire an event, call Dts.Events.FireInformation(99, "test", "hit the help message", "", 0, true);

		To use the connections collection use something like the following:
		ConnectionManager cm = Dts.Connections.Add("OLEDB");
		cm.ConnectionString = "Data Source=localhost;Initial Catalog=AdventureWorks;Provider=SQLNCLI10;Integrated Security=SSPI;Auto Translate=False;";

		Before returning from this method, set the value of Dts.TaskResult to indicate success or failure.
		
		To open Help, press F1.
	*/
        private static string sTimestamp;

        private class CompareTimestamp : IComparer
        {
            int IComparer.Compare(Object x, Object y)
            {
                return x.ToString().Substring(x.ToString().Length - 23, 19).CompareTo(y.ToString().Substring(y.ToString().Length - 23, 19));
            }
        }

        private static bool IsNewer(string sFile)
        {
            if ((sFile.Length >= 23) && (sFile.Substring(sFile.Length - 23, 19).CompareTo(sTimestamp) > 0))
                return true;
            else
                return false;
        }
        public void Main()
        {
            // TODO: Add your code here
            DataTable FileTable = new DataTable();
            IComparer CompareTimestamp = new CompareTimestamp();
            sTimestamp = ((DateTime)Dts.Variables["User::dtLastTimestamp"].Value).ToString("yyyy_MM_dd_HH_mm_ss"); ;
            string sPath = Dts.Variables["User::sUNC"].Value + @"\" + Dts.Variables["User::sInspPlaceName"].Value;
            string[] sFiles = Directory.GetFiles(sPath, @"*.zip");

            sFiles = Array.FindAll(sFiles, IsNewer);
            Array.Sort(sFiles, CompareTimestamp);

            FileTable.Columns.Add("File", typeof(string));
            foreach( string sFile in sFiles)
            {
                FileTable.Rows.Add(sFile);
            }

            Dts.Variables["User::recFileTable"].Value = FileTable;
            Dts.TaskResult = (int)ScriptResults.Success;
        }
    }
}
 

sheel

I love Asm
Hi und Willkommen bei tutorials.de,

C# ist nicht C/C++. Verschoben.

Schreib statt
C#:
FileTable.Rows.Add(sFile);
mal das:
C#:
if((new FileInfo(sFile)).Length > 0)
    FileTable.Rows.Add(sFile);
else
    File.Delete(sFile);