diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ConnectionStringChangeStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ConnectionStringChangeStep.cs
index ea53868812..491955650b 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ConnectionStringChangeStep.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ConnectionStringChangeStep.cs
@@ -1,6 +1,8 @@
using System;
using System.Collections.Generic;
+using System.IO;
using System.Linq;
+using System.Text;
using System.Text.RegularExpressions;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
@@ -21,7 +23,8 @@ namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps
{
try
{
- var jsonObject = JObject.Parse(appSettingsJson.Content);
+ var appSettingJsonContentWithoutBom = GetStringWithoutBom(appSettingsJson.Bytes);
+ var jsonObject = JObject.Parse(appSettingJsonContentWithoutBom);
var connectionStringContainer = (JContainer)jsonObject["ConnectionStrings"];
var firstConnectionString = connectionStringContainer.First;
var defaultConnectionString = firstConnectionString.ToString();
@@ -34,5 +37,24 @@ namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps
}
}
}
+
+ private static string GetStringWithoutBom(byte[] bytes)
+ {
+ if (bytes == null)
+ {
+ return null;
+ }
+
+ var hasBom = bytes.Length >= 3 && bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF;
+
+ if (hasBom)
+ {
+ return Encoding.UTF8.GetString(bytes, 3, bytes.Length - 3);
+ }
+ else
+ {
+ return Encoding.UTF8.GetString(bytes);
+ }
+ }
}
}
diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/IO/FileHelper.cs b/framework/src/Volo.Abp.Core/Volo/Abp/IO/FileHelper.cs
index 21ca7c2086..4c258dfbeb 100644
--- a/framework/src/Volo.Abp.Core/Volo/Abp/IO/FileHelper.cs
+++ b/framework/src/Volo.Abp.Core/Volo/Abp/IO/FileHelper.cs
@@ -1,4 +1,5 @@
using System;
+using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading.Tasks;
@@ -73,6 +74,51 @@ namespace Volo.Abp.IO
}
}
- //TODO: ReadAllLinesAsync
+ ///
+ /// Opens a text file, reads all lines of the file, and then closes the file.
+ ///
+ /// The file to open for reading.
+ /// Encoding of the file. Default is UTF8
+ /// Specifies how the operating system should open a file. Default is Open
+ /// Defines constants for read, write, or read/write access to a file. Default is Read
+ /// Contains constants for controlling the kind of access other FileStream objects can have to the same file. Default is Read
+ /// Length of StreamReader buffer. Default is 4096.
+ /// Indicates FileStream options. Default is Asynchronous (The file is to be used for asynchronous reading.) and SequentialScan (The file is to be accessed sequentially from beginning to end.)
+ /// A string containing all lines of the file.
+ public static async Task ReadAllLinesAsync(string path,
+ Encoding encoding = null,
+ FileMode fileMode = FileMode.Open,
+ FileAccess fileAccess = FileAccess.Read,
+ FileShare fileShare = FileShare.Read,
+ int bufferSize = 4096,
+ FileOptions fileOptions = FileOptions.Asynchronous | FileOptions.SequentialScan)
+ {
+ if (encoding == null)
+ {
+ encoding = Encoding.UTF8;
+ }
+
+ var lines = new List();
+
+ using (var stream = new FileStream(
+ path,
+ fileMode,
+ fileAccess,
+ fileShare,
+ bufferSize,
+ fileOptions))
+ {
+ using (var reader = new StreamReader(stream, encoding))
+ {
+ string line;
+ while ((line = await reader.ReadLineAsync()) != null)
+ {
+ lines.Add(line);
+ }
+ }
+ }
+
+ return lines.ToArray();
+ }
}
}
\ No newline at end of file