programing

c#에서 iCal 파일 만들기

muds 2023. 6. 20. 21:52
반응형

c#에서 iCal 파일 만들기

c#(asp.net )에서 iCalendar 파일(*.ics)을 생성할 수 있는 좋은 방법을 찾고 있습니다.몇 가지 리소스를 찾았지만 한 가지 부족한 점은 캐리지 리턴과 라인 피드가 있는 인용 인쇄 가능 필드에 대한 지원입니다.

예를 들어 설명 필드가 제대로 인코딩되지 않은 경우 첫 번째 줄만 표시되고 *.ics 파일의 나머지 정보가 손상될 수 있습니다.

*.ics 파일을 생성할 수 있는 기존 클래스 및/또는 따옴표로 묶은 필드를 생성할 수 있는 클래스를 찾고 있습니다.

저는 DDay를 사용합니다.Ical, 좋은 물건입니다.icial 파일을 열고 해당 데이터를 멋진 객체 모델로 가져올 수 있습니다.베타라고 쓰여 있지만, 우리에게는 아주 잘 작동합니다.

2016년 11월 편집

이 라이브러리는 더 이상 사용되지 않지만 iCal로 선택되어 다시 릴리스되었습니다.다른 개발자의 NET.

릴리스에 대한 참고 사항: rianjs.net/2016/07/dday-ical-is-now-ical-net

GitHub 소스: github.com/rianjs/ical.net

제가 찾은 가장 쉬운 방법은 마이크로포맷을 사용하여 HTML을 표시하는 것입니다.

iCalendar 파일을 생성하려는 경우 hCalendar 마이크로포맷을 사용하여 다음을 가리키는 'Add to Calendar'와 같은 링크를 포함할 수 있습니다.

http://feeds.technorati.com/events/ [http://]를 포함한 페이지의 전체 URL

그런 다음 Technorati 페이지가 페이지를 구문 분석하고 hCalendar 정보를 추출한 다음 iCalendar 파일을 클라이언트로 보냅니다.

나는 이것을 처리하기 위해 심 함수를 작성했습니다.대부분 호환됩니다. 단, 첫 번째 줄이 75자가 아니라 74자입니다(74자는 후속 줄의 공백을 처리합니다).

 Private Function RFC2445TextField(ByVal LongText As String) As String

     LongText = LongText.Replace("\", "\\")
     LongText = LongText.Replace(";", "\;")
     LongText = LongText.Replace(",", "\,")

     Dim sBuilder As New StringBuilder
     Dim charArray() As Char = LongText.ToCharArray

     For i = 1 To charArray.Length
         sBuilder.Append(charArray(i - 1))
         If i Mod 74 = 0 Then sBuilder.Append(vbCrLf & " ")
     Next

     Return sBuilder.ToString

 End Function

ICS 피드의 요약 및 설명에 사용합니다.필드가 이미 추가된 상태에서 줄을 입력합니다(예: LongText = "Summary: Event Title").캐싱을 상당히 길게 설정하기만 하면 작업 비용이 너무 많이 들지 않습니다.

iCal(iCal 2.0)과 따옴표로 묶인 인쇄물이 서로 맞지 않습니다.

Quoted-printable은 vCal(vCal 1.0)에서 인쇄할 수 없는 문자(예: 줄 바꿈)를 나타내는 데 많이 사용됩니다(=0D=0A).기본 vCal 인코딩은 7비트이므로 따옴표로 묶은 인쇄 가능한 문자를 사용하여 ASCII가 아닌 문자를 표시해야 하는 경우가 있습니다(기본 인코딩을 재정의할 수 있지만 다른 vCal 호환 통신 당사자는 이를 이해할 필요가 없습니다).

iCal에서 특수 문자는 '\n'과 같은 이스케이프를 사용하여 표시됩니다.기본 인코딩은 UTF-8이며, 모든 iCal 호환 당사자가 이를 지원해야 하므로 iCal 2.0(및 vCard 3.0)에서는 따옴표로 인쇄할 필요가 전혀 없습니다.

요구 사항을 명확히 하기 위해 고객/이해 관계자를 지원해야 할 수도 있습니다.vCal과 iCal 사이에 혼동이 있는 것 같습니다.

사용자 지정 시간대에 대한 예제가 없습니다.다음은 ics에서 시간대를 설정하는 방법을 보여주는 스니펫입니다(asp.net 의 브라우저로 전송).

//set a couple of variables for demo purposes
DateTime IcsDateStart = DateTime.Now.AddDays(2);
DateTime IcsDateEnd = IcsDateStart.AddMinutes(90);
string IcsSummary = "ASP.Net demo snippet";
string IcsLocation = "Amsterdam (Netherlands)";
string IcsDescription = @"This snippes show you how to create a calendar item file (.ics) in ASP.NET.\nMay it be useful for you.";
string IcsFileName = "MyCalendarFile";

//create a new stringbuilder instance
StringBuilder sb = new StringBuilder();

//begin the calendar item
sb.AppendLine("BEGIN:VCALENDAR");
sb.AppendLine("VERSION:2.0");
sb.AppendLine("PRODID:stackoverflow.com");
sb.AppendLine("CALSCALE:GREGORIAN");
sb.AppendLine("METHOD:PUBLISH");

//create a custom time zone if needed, TZID to be used in the event itself
sb.AppendLine("BEGIN:VTIMEZONE");
sb.AppendLine("TZID:Europe/Amsterdam");
sb.AppendLine("BEGIN:STANDARD");
sb.AppendLine("TZOFFSETTO:+0100");
sb.AppendLine("TZOFFSETFROM:+0100");
sb.AppendLine("END:STANDARD");
sb.AppendLine("END:VTIMEZONE");

//add the event
sb.AppendLine("BEGIN:VEVENT");

//with a time zone specified
sb.AppendLine("DTSTART;TZID=Europe/Amsterdam:" + IcsDateStart.ToString("yyyyMMddTHHmm00"));
sb.AppendLine("DTEND;TZID=Europe/Amsterdam:" + IcsDateEnd.ToString("yyyyMMddTHHmm00"));

//or without a time zone
//sb.AppendLine("DTSTART:" + IcsDateStart.ToString("yyyyMMddTHHmm00"));
//sb.AppendLine("DTEND:" + IcsDateEnd.ToString("yyyyMMddTHHmm00"));

//contents of the calendar item
sb.AppendLine("SUMMARY:" + IcsSummary + "");
sb.AppendLine("LOCATION:" + IcsLocation + "");
sb.AppendLine("DESCRIPTION:" + IcsDescription + "");
sb.AppendLine("PRIORITY:3");
sb.AppendLine("END:VEVENT");

//close calendar item
sb.AppendLine("END:VCALENDAR");

//create a string from the stringbuilder
string CalendarItemAsString = sb.ToString();

//send the ics file to the browser
Response.ClearHeaders();
Response.Clear();
Response.Buffer = true;
Response.ContentType = "text/calendar";
Response.AddHeader("content-length", CalendarItemAsString.Length.ToString());
Response.AddHeader("content-disposition", "attachment; filename=\"" + IcsFileName + ".ics\"");
Response.Write(CalendarItemAsString);
Response.Flush();
HttpContext.Current.ApplicationInstance.CompleteRequest();

http://www.codeproject.com/KB/vb/vcalendar.aspx 를 확인해 보세요.

당신이 요청한 것처럼 따옴표로 묶인 필드는 처리하지 않지만, 나머지 코드는 거기에 있고 수정할 수 있습니다.

RFC-2445에 따르면 주석 및 설명 필드는 TEXT입니다.테스트 필드의 규칙은 다음과 같습니다. [1] TEXT 필드의 한 줄은 75옥텟을 초과할 수 없습니다.CRLF 다음에 공백을 삽입하여 래핑할 수 있습니다.\ (역 슬래시); (세미콜론), (콤마) 및 새 줄을 포함하여 인코딩해야 하는 몇 가지 문자가 있습니다.\ (역 슬래시)를 구분 기호로 사용하면 \; \, \n을 얻을 수 있습니다.

예:다음은 속성 값에 줄 바꿈 형식이 지정된 속성의 예입니다.

 DESCRIPTION:Meeting to provide technical review for "Phoenix"
   design.\n Happy Face Conference Room. Phoenix design team
   MUST attend this meeting.\n RSVP to team leader.

아이칼은 복잡할 수 있으니 도서관을 이용하는 것을 추천합니다.DDay는 좋은 무료 해결책입니다.마지막으로 확인한 결과 반복 이벤트를 완전히 지원하지는 않았지만, 그 외에는 정말 멋져 보입니다.여러 클라이언트를 사용하여 달력을 확실히 테스트합니다.

나는 그것이 너무 늦었다는 것을 알지만, 그것은 다른 사람들을 도울지도 모릅니다. 나의 경우, 나는 .ics 확장자를 가진 다음 텍스트 파일을 썼습니다.

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Calendly//EN
CALSCALE:GREGORIAN
METHOD:PUBLISH
BEGIN:VEVENT
DTSTAMP:20170509T164109Z
UID:your id-11273661
DTSTART:20170509T190000Z
DTEND:20170509T191500Z
CLASS:PRIVATE
DESCRIPTION:Event Name: 15 Minute Meeting\nDate & Time: 03:00pm - 03:15pm (
 Eastern Time - US & Canada) on Tuesday\, May 9\, 2017\n\nBest Phone Number
  To Reach You :: xxxxxxxxx\n\nany "link": https://wwww.yahoo.com\n\n
SUMMARY:15 Minute Meeting
TRANSP:OPAQUE
END:VEVENT
END:VCALENDAR

그것은 나에게 효과가 있었다.

언급URL : https://stackoverflow.com/questions/10658/creating-ical-files-in-c-sharp

반응형