Ich arbeite an einem Projekt, das zum Entpacken von Ordnern ist, durchlaufen die Dateien in den extrahierten Ordnern und hochgeladene Daten in eine Datenbank, und verschieben Sie die Zip-und Dateiordner in ein anderes Verzeichnis . Ich habe Probleme beim Verschieben des extrahierten Ordners.Zugriff auf Pfad verweigert - C# Directory.Move
Message "Access to the path 'Insurance_Documents\\Test_2017' is denied." string
Mein erster Instinkt war, dass es ein Erlaubnisproblem war. Allerdings habe ich die Erlaubnis überprüft und alles sieht gut aus; Außerdem, da das Programm das Verzeichnis selbst erstellt, erscheint es nicht sehr logisch, dass Berechtigungen die Ursache sind.
Als nächstes, nachdem ich mich im Internet ein wenig angesehen habe, dachte ich, meine uploadReportData() Funktion hätte die Dateien gesperrt (es nutzt Anweisungen), aber ich dachte, es könnte noch eine "Verzögerung" geben, während der die Dateien waren immer noch abgeschlossen). Als Antwort habe ich die Thread.sleep-Anweisung ohne Erfolg in meinen Code eingefügt. Das Programm verschiebt den Zip-Ordner problemlos; Es ist das "normale" Verzeichnis, das mir Probleme bereitet.
Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UploadInsurance.Helpers;
namespace UploadInsurance
{
class Program
{
static void Main(string[] args)
{
try
{
ZipHelper.processDirectory();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message + "\n" + ex.StackTrace);
}
finally {
Console.Read();
}
}
}
}
ZipHelper.cs (teilweise)
static class ZipHelper
{
private static String BASE_DIRECTORY = @"Insurance_Documents\";
private static String OLD_ZIPS = @"Insurance_Documents\Old\";
private static String EXTRACTED_FOLDERS = @"Insurance_Documents\Inserted\";
private static List<String> zipFileList = new List<string>();
private static void getZipFiles()
{
zipFileList = Directory.GetFiles(BASE_DIRECTORY, "*.zip").ToList();
}
private static void processZipFiles()
{
String zipFolderName = "";
String reportFolderName = "";
foreach (String file in zipFileList)
{
folderName = Path.GetFileNameWithoutExtension(file);
reportFolderPath= BASE_DIRECTORY + folderName;
ZipFile.ExtractToDirectory(file, reportFolderPath);
uploadReportData(reportFolderPath);
Directory.Move(file, OLD_ZIPS + Path.GetFileName(file));
Thread.Sleep(2000);
Directory.Move(reportFolderPath + "//", EXTRACTED_FOLDERS + folderName);
}
}
... // MORE CODE HERE, INCLUDE uploadReportData function .. ///
public static void processDirectory()
{
ZipHelper.getZipFiles();
ZipHelper.processZipFiles();
}
Ich habe auch versucht
ÄndernDirectory.Move(reportFolderPath, EXTRACTED_FOLDERS + folderName);
zu
Directory.Move(reportFolderPath + "//", EXTRACTED_FOLDERS + folderName);
aber immer noch den Fehler erhalten. Ich habe versucht, ProcessExplorer herunterzuladen und zu verwenden (wie in einer anderen Antwort hier erwähnt), und der einzige Prozess, der auf dieses Verzeichnis zugreift, ist mein Programm selbst.
Jede Hilfe würde sehr geschätzt werden.
EDIT
ich für die Länge entschuldigen, aber ich vermute, dass das Problem in dem unten stehenden Code liegen:
private static void uploadReportData(String folderPath)
{
String empFile = "";
String reportFile = "";
String spouseFile = "";
String childrenFile = "";
String beneficiaryFile = "";
String visionDependentFile = "";
Boolean hasEmployeeFile = false;
Boolean hasReportFile = false;
foreach (String files in Directory.GetFiles(folderPath).ToList())
{
if (files.Contains("employee"))
{
hasEmployeeFile = true;
empFile = files;
}
if (files.Contains("report"))
{
hasReportFile = true;
reportFile = files;
}
if (files.Contains("spouse"))
{
spouseFile = files;
}
if (files.Contains("children"))
{
childrenFile = files;
}
if (files.Contains("beneficiaries"))
{
beneficiaryFile = files;
}
if (files.Contains("vision"))
{
visionDependentFile = files;
}
}
String employee;
String report;
String vision;
String beneficiary;
String children;
String spouse;
CsvFileReader reader;
try
{
using (InsuranceModel dbContext = new InsuranceModel())
{
EmployeeReportData empData = new EmployeeReportData();
Employee emp;
Report newReport = new Report();
if (empFile != "")
{
report = reportFile;
employee = empFile;
employee.Trim();
reader = new CsvFileReader(employee);
List<String> employees = new List<string>();
while (reader.ReadRow(employees)) { }
String employeeID = employees[0];
emp = dbContext.Employees.FirstOrDefault(em => em.EmployeeID == employeeID);
// see if employee exists in the database
if (emp == null)
{
emp = new Employee();
emp.EmployeeID = employeeID;
emp.SSN = employees[1];
emp.FirstName = employees[2];
emp.LastName = employees[3];
emp.DOB = Convert.ToDateTime(employees[4]);
dbContext.Employees.Add(emp);
}
List<String> reportList = new List<string>();
reader = new CsvFileReader(report);
while (reader.ReadRow(reportList)) { }
newReport.Employee = emp;
newReport.EmployeeID = emp.EmployeeID;
newReport.Year = reportList[1];
newReport.DateSubmitted = Convert.ToDateTime(reportList[2]);
newReport.Action = Convert.ToInt32(reportList[3]);
dbContext.Reports.Add(newReport);
// add employees year specific data regardless
empData.EmployeeFirst = employees[2];
empData.EmployeeLast = employees[3];
empData.EmployeeGender = employees[5];
empData.EmployeeEmail = employees[6];
empData.EmployeeStreet = employees[7];
empData.EmployeeCity = employees[8];
empData.EmployeeState = employees[9];
empData.EmployeeZip = employees[10];
String locCode = employees[11].Trim();
Location loc = dbContext.Locations.First(l => l.LocationCode == locCode);
empData.EmployeeLocation = loc.LocationID;
empData.EmployeePhone = employees[12];
empData.InsurancePlan = Convert.ToInt32(employees[13]);
empData.VisionPlan = Convert.ToInt32(employees[14]);
empData.Status = employees[15].Trim();
empData.Report = newReport;
dbContext.EmployeeReportDatas.Add(empData);
}
if (childrenFile != "")
{
children = childrenFile;
reader = new CsvFileReader(children);
List<String> childrenList = new List<string>();
while (reader.ReadRow(childrenList))
{
ChildReportData newChild = new ChildReportData();
newChild.Report = newReport;
newChild.ChildFirst = childrenList[0];
newChild.ChildLast = childrenList[1];
newChild.ChildDOB = Convert.ToDateTime(childrenList[2]);
newChild.ChildGender = childrenList[3];
newChild.ChildStreet = childrenList[4];
newChild.ChildCity = childrenList[5];
newChild.ChildState = childrenList[6];
newChild.ChildZip = childrenList[7];
newChild.Step = childrenList[8];
newChild.Foster = childrenList[9];
newChild.Student = childrenList[10];
newChild.Handicap = childrenList[11];
newChild.ChildSSN = childrenList[12];
dbContext.ChildReportDatas.Add(newChild);
childrenList.Clear(); // clear in preparation for reading a new row
}
}
if (spouseFile != "")
{
spouse = spouseFile;
reader = new CsvFileReader(spouse);
List<String> spouseList = new List<string>();
while (reader.ReadRow(spouseList)) { }
SpouseReportData newSpouse = new SpouseReportData();
newSpouse.Report = newReport;
newSpouse.SpouseSSN = spouseList[0];
newSpouse.SpouseFirst = spouseList[1];
newSpouse.SpouseLast = spouseList[2];
newSpouse.SpouseStreet = spouseList[3];
newSpouse.SpouseCity = spouseList[4];
newSpouse.SpouseState = spouseList[5];
newSpouse.SpouseZip = spouseList[6];
newSpouse.SpouseGender = spouseList[7];
newSpouse.SpouseDOB = Convert.ToDateTime(spouseList[8]);
newSpouse.SpouseEmployed = spouseList[9];
dbContext.SpouseReportDatas.Add(newSpouse);
}
if (beneficiaryFile != "")
{
beneficiary = beneficiaryFile;
reader = new CsvFileReader(beneficiary);
List<String> beneficiaryList = new List<string>();
while (reader.ReadRow(beneficiaryList))
{
BeneficiaryReportData newBeneficiary = new BeneficiaryReportData();
newBeneficiary.Report = newReport;
newBeneficiary.BeneficiarySSN = beneficiaryList[0];
newBeneficiary.BeneficiaryFirst = beneficiaryList[1];
newBeneficiary.BeneficiaryLast = beneficiaryList[2];
newBeneficiary.BeneficiaryStreet = beneficiaryList[3];
newBeneficiary.BeneficiaryCity = beneficiaryList[4];
newBeneficiary.BeneficiaryState = beneficiaryList[5];
newBeneficiary.BeneficiaryZip = beneficiaryList[6];
newBeneficiary.BeneficiaryPercentage = Convert.ToDecimal(beneficiaryList[7]);
newBeneficiary.BeneficiaryRelationship = beneficiaryList[8];
newBeneficiary.BeneficiaryType = beneficiaryList[9];
dbContext.BeneficiaryReportDatas.Add(newBeneficiary);
beneficiaryList.Clear(); // clear in preparation for reading a new row
}
}
if (visionDependentFile != "")
{
vision = visionDependentFile;
reader = new CsvFileReader(vision);
List<String> visionList = new List<string>();
while (reader.ReadRow(visionList))
{
VisionDependentReportData newVision = new VisionDependentReportData();
newVision.Report = newReport;
newVision.VisionSSN = visionList[0];
newVision.VisionFirst = visionList[1];
newVision.VisionLast = visionList[2];
newVision.VisionDOB = Convert.ToDateTime(visionList[3]);
newVision.VisionGender = visionList[4];
newVision.VisionRelationship = visionList[5];
dbContext.VisionDependentReportDatas.Add(newVision);
visionList.Clear(); // clear in preparation for reading a new row
}
}
dbContext.SaveChanges();
}
}
Wenn Sie das Programm unter Ihrem Konto ausführen, erstellen Sie einfach den Ordner mit Code und führen Sie die Verschiebung manuell aus, während das Programm noch ausgeführt wird. Wenn Sie es nicht manuell verschieben können, sperrt möglicherweise Ihr eigenes Programm eine Datei oder etwas. – CodingYoshi
Danke für den Hinweis. Es ist in der Tat mein Programm, aber ich bin nur nicht sicher, welcher Teil des Codes es blockiert. Ich werde meine uploadReportData-Funktion posten, da ich vermute, dass dies der Fall sein könnte. Vielen Dank. – KellyMarchewa
Es könnte eine gute Idee sein, CsvFileReader über 'using' zu verwenden, wie' using (CsvFileReader reader = new CsvFileReader (children)) {...} 'um sicher zu sein, dass das Datei-Handle außerhalb der using-Klausel freigegeben wird. –