나는 이것이 쉬울 것이라고 생각했지만 내 프로젝트 중 하나에서 csv 파일을 참조하는 방법을 아는 데 어려움이 있습니다.
여기 솔루션 디스플레이에 있습니다.
참조하는 코드에 잘못된 작업 오류가 발생하여 파일을 찾을 수 없으며 스테핑 및 null을 통해 확인되지 않았습니다.
public class CATALOGStateInitialiser : ICATALOGStateInitialiser
{
public void CATALOGInitialiseStates(CATALOGContext context)
{
if (context == null) throw new ArgumentNullException(nameof(context));
if (context.States.Any()) return; //DB table data already created.
using var resourceStream = GetType().Assembly
.GetManifestResourceStream(
"JobsLedger.INITIALISATION.SUBURB.Initialisations.AddressCSV.states.csv");
var reader = new StreamReader(resourceStream ?? throw new InvalidOperationException(), Encoding.UTF8);
reader.Dispose();
var stringStates = reader.ReadToEnd();
var stringSeparators = new[] {"\r\n"};
var states = stringStates.Split(stringSeparators, StringSplitOptions.None)
.Select(FromCsv)
.Where(a => a != null)
.ToList();
context.SaveChanges();
}
public static State FromCsv(string csvLine)
{
if (csvLine == null) throw new ArgumentNullException(nameof(csvLine));
var values = csvLine.Split(',');
if (values.Length <= 1) return null;
var state = new State
{
StateName = values[0],
StateShortName = values[1]
};
return state;
}
}
다음은 실제 csv 파일을 찾으려는 행입니다.
using var resourceStream = GetType().Assembly
.GetManifestResourceStream(
"JobsLedger.INITIALISATION.SUBURB.Initialisations.AddressCSV.states.csv");
.. 그리고 이것은 파일을 찾지 못한 오류를 던지는 줄입니다 :
var reader = new StreamReader(resourceStream ?? throw new InvalidOperationException(), Encoding.UTF8);
그래서 나는 분명히 올바른 경로 나 구문 또는 둘 다를 넣지 않았습니다.
INITIALISATION 라이브러리 프로젝트의 states.csv 위치가 주어지면 어떻게 올바르게 참조합니까?
최신 정보
읽기 전에 Reader를 폐기하고 잘못된 경로를 가지고 있다는 점에서 코드가 약간 잘못되었습니다. 나는 또한 dimlucas가 말한 것을했지만 결국 "Copy to"옵션에서 그것을 embedResource로 변경하고 "copy if newer"로 변경했습니다.
현재 작동하는 코드는 다음과 같습니다.
using System;
using System.IO;
using System.Linq;
using System.Text;
using JobsLedger.CATALOG;
using JobsLedger.CATALOG.ENTITIES;
using JobsLedger.INITIALISATION.CATALOG.Initialisations.Interfaces;
namespace JobsLedger.INITIALISATION.CATALOG.Initialisations
{
public class CATALOGStateInitialiser : ICATALOGStateInitialiser
{
public void CATALOGInitialiseStates(CATALOGContext context)
{
if (context == null) throw new ArgumentNullException(nameof(context));
if (context.States.Any()) return; //DB table data already created.
using var resourceStream = GetType().Assembly
.GetManifestResourceStream(
"JobsLedger.INITIALISATION.AddressCSV.states.csv");
var reader = new StreamReader(resourceStream ?? throw new InvalidOperationException(), Encoding.UTF8);
var stringStates = reader.ReadToEnd();
reader.Dispose();
var stringSeparators = new[] {"\r\n"};
var states = stringStates.Split(stringSeparators, StringSplitOptions.None)
.Select(FromCsv)
.Where(a => a != null)
.ToList();
context.SaveChanges();
}
public static State FromCsv(string csvLine)
{
if (csvLine == null) throw new ArgumentNullException(nameof(csvLine));
var values = csvLine.Split(',');
if (values.Length <= 1) return null;
var state = new State
{
StateName = values[0],
StateShortName = values[1]
};
return state;
}
}
}
Visual Studio를 사용하는 경우 파일을 클릭하고 속성 창으로 이동합니다.
에서 Build Action
옵션 중 하나를 선택 Resource
하거나 Content
.
에서 Copy to Output Directory
옵션을 선택Copy always
이렇게하면 프로젝트를 빌드 할 때 파일이 bin 폴더로 이동됩니다. 현재 .csv 파일은 소스 코드의 일부일 뿐이며 최종적으로 .NET Core에서 실행되는 최종 바이너리의 일부가 아닙니다. 첫 번째 옵션은 파일이 바이너리에 포함되도록하고 두 번째 옵션은 동기화 문제를 방지하기 위해 모든 후속 빌드 작업에서 파일이 복사되도록합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다